跳到主要内容
版本:7.0.3

与交易绑定的事件

Hunyuan 7b 中英对照 Transaction-bound Events

从Spring 4.2开始,事件的监听器可以绑定到事务的某个阶段。一个典型的例子是在事务成功完成后处理该事件。这样做可以在当前事务的结果对监听器真正重要的时候,更加灵活地使用事件。

你可以通过使用@EventListener注解来注册一个常规的事件监听器。如果你需要将其绑定到事务上,可以使用@TransactionalEventListener。这样做时,监听器默认会被绑定到事务的提交阶段。

下一个示例展示了这一概念。假设一个组件发布了一个“订单创建”事件,而我们希望定义一个监听器,该监听器仅在该事件发布的交易成功提交后才会被触发。以下示例就是设置这样一个事件监听器的方法:

@Component
public class MyComponent {

@TransactionalEventListener
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
// ...
}
}

@TransactionalEventListener 注解提供了一个 phase 属性,允许你自定义监听器应绑定到的事务阶段。有效的阶段有 BEFORE_COMMITAFTER_COMMIT(默认值)、AFTER_ROLLBACK,以及 AFTER_COMPLETION,后者涵盖了事务的完成(无论是提交还是回滚)。

如果没有任何事务正在运行,那么监听器根本不会被调用,因为我们无法满足所需的语义规则。不过,你可以通过将注解的 fallbackExecution 属性设置为 true 来覆盖这种行为。

备注

从6.1版本开始,@TransactionalEventListener既可以与由PlatformTransactionManager管理的线程绑定事务一起使用,也可以与由ReactiveTransactionManager管理的反应式事务一起使用。对于前者,监听器可以保证看到当前线程绑定的事务。由于后者使用Reactor上下文而不是线程局部变量,因此需要将事务上下文作为事件源包含在发布的事件实例中。详情请参阅TransactionalEventPublisher的Javadoc。