如何使事件侦听器与 Spring Boot 中的应用程序事件同步发布

How to make event listener synchronous to publish of application event in Spring Boot

我有一些方法可以发布应用程序事件 (MyEvent),然后记录“完成发布”。我遇到的问题是先执行日志语句,然后调用 MyEvent 侦听器。我如何确保执行顺序如下所示:-

  1. 发布活动

  2. 监听事件

  3. 正在执行日志语句[见下面的代码]

    @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
}

现在代码的行为将如您所愿。