1、定義事件繼承ApplicationEvent
/**
* 訂單完成事件
*/
@Getter
public class OrderFinishedEvent extends ApplicationEvent {
private final Order order;
public OrderFinishedEvent(Object source, Order order) {
super(source);
this.order = order;
}
}
2、發布事件
@Resource
private ApplicationContext applicationContext;
applicationContext.publishEvent(new OrderFinishedEvent(this, order));
3、監聽事件
(1)實現ApplicationListener
@Component
public class FirstOrderFinishedListener implements ApplicationListener<OrderFinishedEvent> {
@Override
public void onApplicationEvent(OrderFinishedEvent event) {
Order order = event.getOrder();
...
}
}
(2)注解@EventListener
// ({可監聽多個事件,逗號分隔})
@EventListener(OrderFinishedEvent.class)
// 參數0或1個,返回類型任意(異步@Async時不能返回原生類型如boolean)
public void onApplicationEvent(OrderFinishedEvent event) {
logger.info("訂單完成:{}", JSON.toJSONString(event));
Order order = event.getOrder();
}
備注:監聽事件通常會異步處理,方法加上注解 @Async("threadPoolTaskExecutor"),使用指定線程池異步處理。