事务绑定事件

从Spring 4.2开始,事件的监听器可以绑定到事务的阶段。典型的例子是在事务成功完成时处理事件。这样做可以让事件在当前事务的结果对监听器实际上很重要时更灵活地使用。

您可以通过使用@EventListener注解注册常规事件监听器。如果需要将其绑定到事务,请使用@TransactionalEventListener。这样做时,默认情况下,监听器绑定到事务的提交阶段。

下一个示例展示了这个概念。假设一个组件发布了一个order-created事件,并且我们想要定义一个监听器,该监听器只应在发布它的事务成功提交后处理该事件。以下示例设置了这样一个事件监听器:

  • Java

  • Kotlin

@Component
public class MyComponent {

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

	@TransactionalEventListener
	fun handleOrderCreatedEvent(creationEvent: CreationEvent<Order>) {
		// ...
	}
}

@TransactionalEventListener注解公开了一个phase属性,让您可以自定义监听器应绑定到事务的阶段。有效的阶段包括BEFORE_COMMITAFTER_COMMIT(默认)、AFTER_ROLLBACK,以及AFTER_COMPLETION,它汇总了事务完成(无论是提交还是回滚)。

如果没有运行任何事务,则根本不会调用监听器,因为我们无法遵守所需的语义。但是,您可以通过将注解的fallbackExecution属性设置为true来覆盖该行为。

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