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.