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.