package com.ruoyi.message.wechat; import com.ruoyi.message.SendException; import com.ruoyi.message.SendResult; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; /** * 微信公众号发送方工厂:按 key 路由到一个具体实现。 *

* 注意:公众号通道的 key 与短信通道的 key 可以同名(例如 {@code hzszlyy} 既有短信发送方 * 也有公众号发送方),因此两个工厂各自维护自己的注册表,互不干扰。 */ @Slf4j @Component public class WechatSenderFactory { private final Map senders = new LinkedHashMap<>(); public WechatSenderFactory(List senderList) { for (WechatSender sender : senderList) { WechatSender exists = senders.put(sender.key(), sender); if (exists != null) { throw new IllegalStateException("公众号发送方 key 重复:" + sender.key() + ",冲突实现:" + exists.getClass().getName() + " 与 " + sender.getClass().getName()); } } log.info("【WechatSenderFactory】已注册公众号发送方:{}", senders.keySet()); } /** * 按 key 获取发送方 * * @param key 渠道 key(即 {@code spring.profiles.active} 取值) * @throws SendException 找不到对应实现时抛出 */ public WechatSender get(String key) { WechatSender sender = key == null ? null : senders.get(key); if (sender == null) { throw new SendException("未找到公众号发送方,key=" + key + ",已注册:" + senders.keySet()); } return sender; } /** * 按 key 获取发送方,找不到返回 {@code null} */ public WechatSender getOrNull(String key) { return key == null ? null : senders.get(key); } /** * 按 key 发送公众号消息 */ public SendResult send(String key, WechatSendRequest request) { return get(key).send(request); } /** * 判断是否存在该 key 的发送方 */ public boolean supports(String key) { return getOrNull(key) != null; } /** * 已注册的渠道 key */ public Set keys() { return new TreeSet<>(senders.keySet()); } }