トランザクションバウンドイベント

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 は ReactiveTransactionManager によって管理されるリアクティブトランザクションだけでなく、PlatformTransactionManager によって管理されるスレッドバインドされたトランザクションでも動作できます。前者の場合、リスナーは現在のスレッドバインドされたトランザクションを確認できることが保証されます。後者はスレッドローカル変数の代わりに Reactor コンテキストを使用するため、トランザクションコンテキストを発行されたイベントインスタンスにイベントソースとして含める必要があります。詳細については、TransactionalEventPublisher javadoc を参照してください。