步骤
- 定义事件发布器,需要实现ApplicationEventPublisherAware接口
- 定义事件监听器,需要继承ApplicationEvent类
- 定义响应事件,需要继承ApplicationListener<T>接口
定义事件发布器,ApplicationEventPublisherAware
@Component
public class EventDistributor implements ApplicationEventPublisherAware {
private static ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
EventDistributor.applicationEventPublisher = applicationEventPublisher;
}
/**
* 发布同步事件
* @param event 事件主题
*/
public static void publishEvent(ApplicationEvent event) {
try {
applicationEventPublisher.publishEvent(event);
}catch (Exception e){
e.printStackTrace();
System.out.println("事件发布成功,有部分执行失败");
}
}
/**
* 发布异步事件,会等待当前事务提交完成后再进行事件发布
* @param event 事件主题
*/
public static void publishTransactionSyncEvent(ApplicationEvent event) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
try{
applicationEventPublisher.publishEvent(event);
}catch (Exception e){
e.printStackTrace();
}
}
});
}
}
定义事件监听器,ApplicationEvent
public class TicketAddEvent extends ApplicationEvent {
public TicketAddEvent(ClienteleTicketMessage userTicketMessage) {
super(userTicketMessage);
}
}
在需要被监听处使用:
EventDistributor.publishEvent(new TicketAddEvent(参数));
定义响应事件,ApplicationListener
@Component
public class TicketOverviewListener implements ApplicationListener<TicketAddEvent> {
@Async//异步
@Override
public void onApplicationEvent(TicketAddEvent ticketAddEvent) {
ClienteleTicketMessage userTicketMessage = (ClienteleTicketMessage) ticketAddEvent.getSource();//接受参数
响应逻辑
}
监听完成