借鉴: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
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):当一个请求被处理完成时发布事件。