メッセージ駆動型 Bean - サービス統合バスを使用したトランザクション処理
メッセージ駆動型 Bean は、トランザクションの有効範囲内で、宛先 (またはエンドポイント) 上のメッセージを処理することができます。
選択したメッセージ駆動型 Bean デプロイメント記述子設定に基づくケースが、3 つ考えられます。 コンテナー管理トランザクション (必須)、コンテナー管理トランザクション (サポート対象外)、および Bean 管理トランザクションです。
メッセージ駆動型 Bean のデプロイメント記述子の設定では、メッセージ駆動型 Bean が自身のトランザクションを管理するのか (Bean 管理トランザクション)、メッセージ駆動型 Bean の代わりにコンテナーがトランザクションを管理するのか (コンテナー管理トランザクション) を選択できます。 メッセージ駆動型 Bean デプロイメント記述子の設定について詳しくは、メッセージ駆動型 Bean デプロイメント記述子の属性を参照してください。コンテナー管理トランザクションを選択する場合は、デプロイメント記述子のノートブックで、Bean の各メソッドのコンテナー・トランザクション・タイプを選択して、コンテナー・トランザクションが必須なのかサポートされないのかを決定できます。 デフォルトのコンテナー・トランザクション・タイプが必要です。
- コンテナー管理トランザクション (必須)
この場合は、 宛先から届いた着信メッセージを読み取る前に、 さらに、アプリケーション・サーバーに よってメッセージ駆動型 Bean の onMessage() メソッドが呼び出される前に、 アプリケーション・サーバーが グローバル・トランザクションを開始します。 つまり、メッセージによって順番に呼び出される他の EJB、 およびデータベースなどのリソースとの対話の有効範囲のすべてを、 着信メッセージが取得された、 この単一のグローバル・トランザクション内に 設定することが可能になるわけです。
このアプリケーション・フローが正常終了した場合に、 グローバル・トランザクションがコミットされます。 このフローが正常終了しない場合 (トランザクションにロールバックのマークが付いた場合、またはランタイム例外が発生した場合)、トランザクションはロールバックされ、着信メッセージがメッセージ駆動型 Bean の宛先にロールバックされます。
- コンテナー管理トランザクション (サポート対象外)
この場合、グローバル・トランザクションは存在しません。 ただし JMS プロバイダーは、メッセージ駆動型 Bean 宛先から作業単位内の アプリケーション・サーバーに向けて、引き続きメッセージを送信できます。 トランザクション有効範囲内の他のリソースが関与していないため、 これをローカル・トランザクションと見なすことができます。
アプリケーション・サーバーは、メッセージ駆動型 Bean の onMessage() ディスパッチが 正常終了すると、メッセージの送信を確認します (メッセージ駆動型 Bean のアセンブラーが 指定した確認通知モードを使用)。
しかし、onMessage() メソッドから 未チェックのランタイム例外がスローされた場合には、アプリケーション・サーバーは確認通知を行いません。 その場合、メッセージはメッセージ駆動型 Bean 宛先にロールバックされるのでしょうか (あるいは、確認後に削除されるのでしょうか)。
それは、JMS プロバイダーが同期点を使用するかどうかによって異なります。また、オペレーティング・プラットフォームによっても異なります (特に z/OS® オペレーティング・プラットフォームは、 この場合に異なる振る舞いを引き起こす可能性があります)。
JMS プロバイダーが、このコンテナー管理トランザクションのケース (サポート対象外) 内 のメッセージ駆動型 Bean メッセージ使用量において同期点を確立すると、メッセージは、未チェックの例外の後に、宛先にロールバックされます。
同期点が使用されない場合、 メッセージは、未チェックの例外の後に、宛先から削除されます。
関連情報については、技術情報「MDB behavior is different on z/OS than on distributed when getting nonpersistent messages within syncpoint」(http://www.ibm.com/support/docview.wss?uid=swg21231549) を参照してください。
- Bean 管理トランザクション
この場合、アクションはコンテナー管理トランザクション (サポート対象外) のケースに似ています。 このケースでは、ユーザー・トランザクションは 存在しますが、メッセージ駆動型 Bean の onMessage() ディスパッチ内で 開始されたユーザー・トランザクションには、トランザクション有効範囲内にある メッセージ駆動型 Bean の宛先からの メッセージ使用量は含まれません。 この場合は、コンテナー管理トランザクション (必須) のシナリオを使用してください。