Guava的事件总线EventBus库是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。下面是常用的异步事件的例子:
1、 在configure里面声明异步处理类
@Bean
public AsyncEventBus asyncEventBus(){
return new AsyncEventBus(Executors.newFixedThreadPool(100));
}`
线程池共100线程
2、 定义一个实体类用来装载事件内容
public class SmsEvent {
private Long smsId;
private String telphone;
private String content;
public SmsEvent(Long smsId, String telphone, String content) {
this.smsId = smsId;
this.telphone = telphone;
this.content = content;
}
public String getTelphone() {
return telphone;
}
public void setTelphone(String telphone) {
this.telphone = telphone;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Long getSmsId() {
return smsId;
}
public void setSmsId(Long smsId) {
this.smsId = smsId;
}
}
public class NoticeSmsEvent extends SmsEvent {
public NoticeSmsEvent(Long smsId, String telphone, String content) {
super(smsId, telphone, content);
}
}
3、创建事件监听
既然是发布–订阅模式,所以我们首先要发布一个监听。
@Component
public class NoticeSmsListener {
@Autowired
private AsyncEventBus asyncEventBus;
//注册这个监听器
@PostConstruct
public void register() {
asyncEventBus.register(this);
}
@Subscribe
public void sendSms(NoticeSmsEvent smsEvent) {
//这里写需要异步执行的逻辑
boolean result=SmsUtil.send(smsEvent.getTelphone(),smsEvent.getContent(),"SendNoticeSms",propertyMapper);
}
}
4、调用异步事件
在需要执行第三步逻辑的地方订阅这个发布,并且推送信息。
NoticeSmsEvent noticeSmsEvent = new NoticeSmsEvent(id, mobilePhone, smsContent);
asyncEventBus.post(noticeSmsEvent);