Spring订阅发布

2020-05-23   


Spring订阅发布

场景

  项目中在主业务完成之后需要对接一项其他业务模块的功能,为了不影响主业务的响应速度打算使用异步调用,同时考虑到对接的这项业务模块以后其他地方也会有相应调用,于是Spring的订阅发布成了不二选择。

简介

  Spring的订阅发布本质上是观察者模式的一种实现。观察者模式是一种行为设计模式,它定义了一种订阅机制,可以在对象事件发生时通知多个观察该对象的其他对象。

  • 事件:ApplicationEvent继承自EventObject,我们通过继承ApplicationEvent来声明一个事件,在事件中可以添加一些业务参数。
  • 事件发布:通过ApplicationEventPublisher的publishEvent方法发布一个事件。
  • 事件监听:监听事件以触发相关业务操作,可以通过实现ApplicationListener或者使用@EventListener、@TransactionalEventListener注解。
demo
@Data
@EqualsAndHashCode(callSuper = false)
public class MyEvent extends ApplicationEvent {

    //业务参数
    private String id;

    public MyEvent(Object source, String id) {
        super(source);
        this.id = id;
    }
}
@Service
public class MyEventPublishTest {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    //由于使用@TransactionalEventListener,此处必须加上事务注解
    @Transactional(rollbackFor = Exception.class)
    public void doBussiness(){
        //todo
        String id = UUID.randomUUID().toString();
        applicationEventPublisher.publishEvent(new MyEvent(this,id));
    }

}
@Component
public class MyListener {

    //在事务提交成功后才进行事件处理
    @TransactionalEventListener(value = MyEvent.class, phase = TransactionPhase.AFTER_COMMIT)
    public void applyMyEvent(ApplicationEvent event) {
        if (event instanceof MyEvent) {
            MyEvent myEvent = (MyEvent) event;
            String id = myEvent.getId();
            //todo
        }
    }

}
其他

关于观察者模式的详细描述建议看下这本书的相关介绍。
https://refactoringguru.cn/design-patterns/observer

Q.E.D.