事務繫結事件

自 Spring 4.2 起,事件監聽器可以繫結到事務的一個階段。典型的例子是在事務成功完成時處理事件。這樣做可以在監聽器確實關心當前事務結果時,更靈活地使用事件。

你可以使用 @EventListener 註解註冊一個常規事件監聽器。如果你需要將其繫結到事務,請使用 @TransactionalEventListener。預設情況下,監聽器會繫結到事務的提交階段。

下一個示例展示了這個概念。假設一個元件釋出了一個訂單建立事件,我們希望定義一個監聽器,該監聽器只應在該事件釋出的事務成功提交後才處理該事件。以下示例設定了這樣一個事件監聽器:

  • 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。

© . This site is unofficial and not affiliated with VMware.