使用Guava的eventBus完成异步事件


Guava的事件总线EventBus库是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。下面是常用的异步事件的例子:

1、 在configure里面声明异步处理类

1 @Bean
2     public AsyncEventBus asyncEventBus(){
3         return new AsyncEventBus(Executors.newFixedThreadPool(100));
4     }

线程池共100线程

2、 定义一个实体类用来装载事件内容

 1 public class SmsEvent {
 2     private Long smsId;
 3     private String telphone;
 4     private String content;
 5 
 6     public SmsEvent(Long smsId, String telphone, String content) {
 7         this.smsId = smsId;
 8         this.telphone = telphone;
 9         this.content = content;
10     }
11 
12     public String getTelphone() {
13         return telphone;
14     }
15 
16     public void setTelphone(String telphone) {
17         this.telphone = telphone;
18     }
19 
20     public String getContent() {
21         return content;
22     }
23 
24     public void setContent(String content) {
25         this.content = content;
26     }
27 
28     public Long getSmsId() {
29         return smsId;
30     }
31 
32     public void setSmsId(Long smsId) {
33         this.smsId = smsId;
34     }
35 }
1 public class NoticeSmsEvent extends SmsEvent {
2 
3     public NoticeSmsEvent(Long smsId, String telphone, String content) {
4         super(smsId, telphone, content);
5     }
6 }

3、创建事件监听
既然是发布–订阅模式,所以我们首先要发布一个监听。

 1 @Component
 2 public class NoticeSmsListener {
 3     @Autowired
 4     private AsyncEventBus asyncEventBus;
 5 
 6     //注册这个监听器
 7     @PostConstruct
 8     public void register() {
 9         asyncEventBus.register(this);
10     }
11 
12     @Subscribe
13     public void sendSms(NoticeSmsEvent smsEvent) {
14         //这里写需要异步执行的逻辑
15         boolean result=SmsUtil.send(smsEvent.getTelphone(),smsEvent.getContent(),"SendNoticeSms",propertyMapper);
16     }
17 }

4、调用异步事件

在需要执行第三步逻辑的地方订阅这个发布,并且推送信息。

NoticeSmsEvent noticeSmsEvent = new NoticeSmsEvent(id, mobilePhone, smsContent);
            asyncEventBus.post(noticeSmsEvent);

之前也用过spring的事件监听,guava的方式更加简洁方便

转自:https://blog.csdn.net/will0532/article/details/78840572