使用Guava的eventbus完成异步事件的简单例子

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);

你可能感兴趣的:(java)