使用适配器模式重构消息服务器代码
需求
在平时生产开发中,很多场景目前都会用到发送邮件,短信等一系列的推送消息的功能,往往我们需要搭建一个消息服务器,用于异步处理这些需求。接下来简单总结一下定义消息处理接口
1.定义一个适配器接口,提供发送消息的方法
public interface MessageAdapter {
//接受消息,json为发送消息的类型及内容
public void distribute(JSONObject jsonObject);
}
2.创建一个类,用于监听消息队列生成的消息
@Slf4j
@Component
public class ConsumerDistribute {
@Autowired
private SMSMailboxService smsMailboxService;
@JmsListener(destination = "mail_queue")
public void distribute(String json) {
log.info("###消息服务###收到消息,消息内容 json:{}", json);
if (StringUtils.isEmpty(json)) {
return;
}
JSONObject jsonObject = new JSONObject().parseObject(json);
JSONObject header = jsonObject.getJSONObject("header");
String interfaceType = header.getString("smsType");
MessageAdapter messageAdapter = null;
//通过判断报文中的类型,选择调用实现类
switch (smsType) {
// 发送邮件
case MQInterfaceType.SMS_MAIL:
//适配实现类
messageAdapter=smsMailboxService;
break;
default:
break;
}
JSONObject content=jsonObject.getJSONObject("content");
messageAdapter.distribute(content);
}
}
3.具体的实现功能的方法
//实现了适配器类的方法,适配器可以理解为一个接口,那么我们现在要实现这个接口里面的方法,在步骤2,当获取消息队列的报文时,已经通过smsType将类型装转换成了SMSMailboxService,所以实现类会走这个方法,同样到,如果报文中smsType为发送短信的,那么调用的就是 SMSMessageService
@Slf4j
@Service
public class SMSMailboxService implements MessageAdapter {
@Autowired
private JavaMailSender mailSender; // 自动注入的Bean
@Override
public void distribute(JSONObject jsonObject) {
String mail=jsonObject.getString("mail");
String userName=jsonObject.getString("userName");
log.info("###消费者收到消息... mail:{},userName:{}",mail,userName);
// 发送邮件
// 开始发送邮件
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(mail);
message.setTo(mail); // 自己给自己发送邮件
message.setSubject("哈哈,就是这么简单");
message.setText("适配器模式重构消息服务");
log.info("###发送短信邮箱 mail:{}", mail);
mailSender.send(message);
}
}
总结一下: 其实就是我们有多个功能类似的业务,咱们可以定义一个接口,里面的方法是每个功能都需要用到的,然后不同的Service就集成这个接口,就会有不同的实现方案,在我们选择调用的时候,通过判断类型,决定调用哪个具体的实现类。
参考报文
{
"header": {
"interfaceType": "接口类型"
},
"content": {}
}