Spring:ApplicationEventPublisher事件发布与监听

作为一个稀有的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中,再次处理。

你可能感兴趣的:(其他,spring,java)