使用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