トランザクションバウンドイベント
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_COMMIT
、AFTER_COMMIT
(デフォルト)、AFTER_ROLLBACK
、トランザクションの完了(コミットまたはロールバック)を集約する AFTER_COMPLETION
です。
トランザクションが実行されていない場合、必要なセマンティクスを尊重できないため、リスナーはまったく呼び出されません。ただし、アノテーションの fallbackExecution
属性を true
に設定することにより、この動作をオーバーライドできます。
6.1 以降、 |