如何使事件侦听器与 Spring Boot 中的应用程序事件同步发布
How to make event listener synchronous to publish of application event in Spring Boot
我有一些方法可以发布应用程序事件 (MyEvent),然后记录“完成发布”。我遇到的问题是先执行日志语句,然后调用 MyEvent 侦听器。我如何确保执行顺序如下所示:-
发布活动
监听事件
正在执行日志语句[见下面的代码]
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method() {
//save something in db
applicationEventPublisher.publishEvent(new MyEvent(...params));
log.info("done publishing");
});
}
@TransactionalEventListener
@Order(2)
public void handle(MyEvent myEvent) {
//do something
}
@TransactionalEventListener
是绑定到当前事务的事件监听器。它将在给定的阶段执行事件,默认为 AFTER_COMMIT
.
因此在您的情况下,事件将在 method()
执行后执行。因此事件将被触发,但尚未被所述侦听器执行。因此你看到的行为。
事实上,默认情况下,该事件已经同步传送,而不是异步传送(由于您看到的行为,您希望如此)。
如果您想直接执行事件,请使用常规 @EventListener
而不是 @TransactionalEventListener
。
@EventListener
@Order(2)
public void handle(MyEvent myEvent) {
//do something
}
现在代码的行为将如您所愿。
我有一些方法可以发布应用程序事件 (MyEvent),然后记录“完成发布”。我遇到的问题是先执行日志语句,然后调用 MyEvent 侦听器。我如何确保执行顺序如下所示:-
发布活动
监听事件
正在执行日志语句[见下面的代码]
@Transactional(propagation = Propagation.REQUIRES_NEW) public void method() { //save something in db applicationEventPublisher.publishEvent(new MyEvent(...params)); log.info("done publishing"); }); } @TransactionalEventListener @Order(2) public void handle(MyEvent myEvent) { //do something }
@TransactionalEventListener
是绑定到当前事务的事件监听器。它将在给定的阶段执行事件,默认为 AFTER_COMMIT
.
因此在您的情况下,事件将在 method()
执行后执行。因此事件将被触发,但尚未被所述侦听器执行。因此你看到的行为。
事实上,默认情况下,该事件已经同步传送,而不是异步传送(由于您看到的行为,您希望如此)。
如果您想直接执行事件,请使用常规 @EventListener
而不是 @TransactionalEventListener
。
@EventListener
@Order(2)
public void handle(MyEvent myEvent) {
//do something
}
现在代码的行为将如您所愿。