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