Spring事件发布ApplicationEventPublisher原理

发布时间:2024年01月23日

借鉴:https://blog.csdn.net/zxfhahaha/article/details/112558429
https://blog.csdn.net/qq_46940224/article/details/131043987
https://blog.csdn.net/weixin_37672801/article/details/128803430
https://www.cnblogs.com/shamo89/p/15715091.html
https://blog.csdn.net/laohuangaa/article/details/119772453

Spring事件发布原理(ApplicationEventPublisher接口)

1.事件发布的使用:

事件驱动机制其实是观察者模式(又称发布订阅)具体实现,事件对象(HtwBikeRoadSignEvent)相当于被观察对象, 事件监听(EventListener) 相当于观察者。@EventListener()括号里面是哪个对象就是监听哪个对象。

HtwBikeRoadSignAction.java: 自己定义的类,在方法中发布事件

@Service
public class HtwBikeRoadSignAction implements AssetInBoundAction {
    @Autowired
    private HtwBikeRepository htwBikeRepository;
    @Resource
    private ApplicationContext applicationContext;
    @Resource
    private CityExtInfoIntegrationService cityExtInfoIntegrationService;
    @Autowired
    private AssetAddressAndStatusConvertManager convertManager;

    @Override
    public AssetsInBoundResult apply(AssetContext context, AssetsInBoundParam param) {
        AssetsInBoundResult assetsResult = new AssetsInBoundResult();
        List<Long> bikeIds = Collections.emptyList();
        bikeIds.add(12245L);
        List<HtwBikeEntity> htwBikeEntityList = htwBikeRepository.getByIds(bikeIds);
        HtwBikeRoadSignEvent htwBikeRoadSignEvent = HtwBikeRoadSignEvent.builder()
                .context(context)
                .htwBikeEntities(htwBikeEntityList)
                .build();
        //更新车辆信息
        modifyHtwBikeInfo(context, htwBikeEntityList);
         */
        // 5.发送车辆绑定事件
        applicationContext.publishEvent(htwBikeRoadSignEvent);

        assetsResult.setInBoundResult(true);
        return assetsResult;
    }
}

HtwBikeRoadSignEvent.java:

/**
 * 路面签收事件
 */
@Data
@Builder
public class HtwBikeRoadSignEvent extends AssetSopEvent {
    /**
     * 操作上下文
     */
    private AssetContext context;
    /**
     * 车辆信息
     */
    private List<HtwBikeEntity> htwBikeEntities;
    /**
     * 车辆更新字段
     */
    private Map<String,Object> bikeUpdateMap;
    /**
     * 锁更新字段
     */
    private Map<String,Object> lockUpdateMap;
}

HtwBikeRoadSignSrmHandler.java:

/**
 * 车辆路面签收通知
 */
@Component
public class HtwBikeRoadSignSrmHandler {

    @Value("${srm.producer.topic}")
    private String                  srmGatewayTopic;

    /*@Resource(name = "exporterBlocMessageProducer")
    private BlocMessageProducerImpl producer;*/
    @Async
    @EventListener(HtwBikeRoadSignEvent.class)
    public void onRoadSign(HtwBikeRoadSignEvent event) {

        AssetContext context = event.getContext();
        List<HtwBikeEntity> htwBikeEntities = event.getHtwBikeEntities();

        AssetChangeOrderMessageDTO assetChangeOrderMessageDTO = new AssetChangeOrderMessageDTO();
        assetChangeOrderMessageDTO.setChangeType(1);
        //producer.sendMessage(srmGatewayTopic, assetChangeOrderMessageDTO);
    }



}

@Async 添加注解表示这个方法要异步执行

2.Spring的两种监听器的实现有两种方式:

实现ApplicationListener接口 :方法是onApplicationEvent(E event);
注解@EventListener

3.原理: 待自己补充:TODO ,先看这个里面的有源码贴图: https://www.cnblogs.com/shamo89/p/15715091.html 或者 https://blog.csdn.net/laohuangaa/article/details/119772453

4.观察者模式:

包含观察者和目标(被观察者)两种对象。目标和观察者之间存在一对多的关系,通过建立目标与观察者之间的联系,当目标的某个状态发生变化时,所有与之关联的观察者都会得到通知并执行各自的任务。

也称 发布-订阅模式:
订阅:观察者向目标对象注册自己,告诉目标对象自己在观察它。
发布:当目标对象的状态发生改变时,向它所有的观察者发送通知,观察者收到通知后执行各自的操作。

优点:降低了目标与观察者之间的耦合关系。
缺点:目标与观察者之间没有完全解耦,还可能出现循环引用;当观察者对象很多时,通知的发布可能会很耗时。

5.Spring5种标准事件: Spring源码中也是用了事件发布,下面的是监听对象即事件

上下文更新事件(ContextRefreshedEvent): ApplicationContext初始化或刷新,或者说在容器实例化(refresh())时发布事件;
上下文开始事件(ContextStartedEvent):Spring容器启动时,即调用ConfigurableApplicationContext接口的start()时发布事件;
上下文停止事件(ContextStoppedEvent):Spring容器停止时,即调用ConfigurableApplicationContext接口的stop()时发布事件,关闭的容器可以通过start()重启;
上下文关闭事件(ContextClosedEvent):Spring容器关闭时,即调用ConfigurableApplicationContext接口的close()时发布事件,所有的Bean已被销毁,无法重启容器;
请求处理事件(RequestHandledEvent):当一个请求被处理完成时发布事件。

文章来源:https://blog.csdn.net/qq_43185254/article/details/135760449
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。