作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)
一、概述
Spring的事件机制是观察者模式的典型,跟发布订阅模式也十分接近,被观察者发布事件,观察者监听到事件,然后处理事件。这个模式的应用场景有用户注册等,比如用户注册后需要给用户发送优惠券,这时用户注册就是被观察者,事件是发送优惠券。
二、实现
1、事件
首先需要定义事件,继承ApplicationEvent类
public class OrderStateEvent extends ApplicationEvent {
public OrderStateEvent(OrderStateEventSource source) {
super(source);
}
}
2、观察者
使用@EventListener注解,监听ApplicationEventPublisher发布的事件。
@Slf4j
@Configuration
public class OrderStateEventListener {
/**
* 订单状态事件
*/
//使用异步注解
@Async
@EventListener({OrderStateEvent.class})
public void processOrderStateEvent(OrderStateEvent event) {
OrderStateEventSource source = (OrderStateEventSource) event.getSource();
//省略
...
}
3、被观察者
在需要发布事件的服务里,使用ApplicationEventPublisher发布事件。
//提交订单发布事件
public String submitOrder(OrderSubmitRequest orderSubmitRequest) {
...
//发送消息
applicationEventPublisher.publishEvent(new OrderStateEvent());
}
注意:如果在处理事件中发生异常,导致事件没有被处理成功,需要有补偿机制,比如记录在数据库中,再次处理,或者存到redis中,再次处理。