1、创建一个支付事件
//继承ApplicationEvent类
public class PayEvent extends ApplicationEvent {
//消息体
private Map<String,String> map;
//订阅主题
private String topic;
public PayEvent(Object source, Map<String, String> map, String topic) {
//调用父类的构造器
super(source);
this.map = map;
this.topic = topic;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
}
2、创建事件监听类
//短信监听,实现ApplicationListener接口,重写onApplicationEvent()方法
@Component
@Async
public class SmsListener implements ApplicationListener<PayEvent> {
@Override
public void onApplicationEvent(PayEvent payEvent) {
//订阅主题
String topic = payEvent.getTopic();
//消息体
Map<String, String> map = payEvent.getMap();
//发送短信
System.out.println("订阅主题是:" + topic + ";发送短信:" + map.get("msg"));
}
}
//公众号监听
@Component
@Async
public class WechatListener implements ApplicationListener<PayEvent> {
@Override
public void onApplicationEvent(PayEvent payEvent) {
String topic = payEvent.getTopic();
Map<String, String> map = payEvent.getMap();
System.out.println("订阅主题是:" + topic + ";发送公众号消息:" + map.get("msg"));
}
}
//邮箱监听
@Component
@Async
public class MailListener implements ApplicationListener<PayEvent> {
@Override
public void onApplicationEvent(PayEvent payEvent) {
String topic = payEvent.getTopic();
Map<String, String> map = payEvent.getMap();
System.out.println("订阅主题是:" + topic + ";发送邮件:" + map.get("msg"));
}
}
//App站内消息监听
@Component
@Async
public class AppListener implements ApplicationListener<PayEvent> {
@Override
public void onApplicationEvent(PayEvent payEvent) {
String topic = payEvent.getTopic();
Map<String, String> map = payEvent.getMap();
System.out.println("订阅主题是:" + topic + ";发送App站内消息:" + map.get("msg"));
}
}
3、Service
@Override
public String pay(String channel, String amount) throws Exception {
PayStrategy payStrategy = PayStrategyFactory.getPayStrategy(channel);
if(payStrategy == null){
return "输入渠道码有误";
}
String msg = payStrategy.pay(channel, amount);
Map<String,String> map = new HashMap<>();
map.put("msg",msg);
//创建一个支付事件
PayEvent payEvent = new PayEvent(this, map, "支付");
//获取Spring的ApplicationContext容器,发布事件,监听类监听到事件后就会发送消息
SpringContextUtil.getApplicationContext().publishEvent(payEvent);
return msg;
}