Transaction-bound Events
从 Spring 4.2 开始,事件的监听器可以被绑定到事务的某个阶段。典型的例子是在事务成功完成时处理该事件。这样做可以让事件在当前事务的结果对监听器来说确实很重要的时候被更灵活地使用。
你可以通过使用 @EventListener
注解来注册一个普通的事件监听器。如果你需要将其绑定到事务上,请使用@TransactionalEventListener
。当你这样做的时候,监听器会被默认绑定到事务的提交阶段。
下一个例子展示了这个概念。假设一个组件发布了一个创建订单的事件,我们想定义一个监听器,这个监听器只在发布该事件的事务成功提交后才处理该事件。下面的例子设置了这样一个事件监听器:
@Component
public class MyComponent {
@TransactionalEventListener
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
// ...
}
}
@TransactionalEventListener
注解暴露了一个阶段属性,让你自定义监听器应该被绑定的事务的阶段。有效的阶段是BEFORE_COMMIT、AFTER_COMMIT(默认)、AFTER_ROLLBACK,以及 AFTER_COMPLETION,它将事务完成(无论是提交还是回滚)聚集起来。
如果没有事务在运行,监听器根本就不会被调用,因为我们无法满足所需的语义。然而,你可以通过将注解的 fallbackExecution 属性设置为true 来覆盖这一行为。
:::info @TransactionalEventListener 只适用于由 PlatformTransactionManager 管理的线程绑定的事务。由 ReactiveTransactionManager 管理的反应式事务使用 Reactor 上下文而不是线程本地属性,所以从事件监听器的角度来看,没有兼容的活动事务,它可以参与其中。 :::
:::tips
@TransactionalEventListener 是在 org.springframework:spring-tx 包中,不过暂时没有发现 CreationEvent