事務綁定事件

從 Spring 4.2 開始,事件的 Listener 可以綁定到交易的階段。典型的範例是在交易成功完成時處理事件。這樣做可以在目前的交易結果對 Listener 真正重要時,更彈性地使用事件。

您可以使用 @EventListener 註解來註冊常規事件 Listener。如果您需要將其綁定到交易,請使用 @TransactionalEventListener。這樣做時,Listener 預設會綁定到交易的 commit 階段。

下一個範例說明了這個概念。假設組件發布了訂單建立事件,並且我們想要定義一個 Listener,該 Listener 僅應在發布該事件的交易成功 commit 後才處理該事件。以下範例設定了這樣一個事件 Listener

  • Java

  • Kotlin

@Component
public class MyComponent {

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

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

@TransactionalEventListener 註解公開了一個 phase 屬性,可讓您自訂 Listener 應綁定的交易階段。有效的階段為 BEFORE_COMMITAFTER_COMMIT (預設值)、AFTER_ROLLBACK,以及彙總交易完成 (無論是 commit 還是 rollback) 的 AFTER_COMPLETION

如果沒有交易正在執行,則根本不會調用 Listener,因為我們無法遵守所需的語意。但是,您可以將註解的 fallbackExecution 屬性設定為 true 來覆寫該行為。

從 6.1 開始,@TransactionalEventListener 可以與由 PlatformTransactionManager 管理的線程綁定交易以及由 ReactiveTransactionManager 管理的反應式交易一起使用。對於前者,保證 Listener 可以看到當前的線程綁定交易。由於後者使用 Reactor context 而不是線程本地變數,因此交易 context 需要作為事件來源包含在已發布的事件實例中。有關詳細資訊,請參閱 TransactionalEventPublisher javadoc。