メッセージ駆動型 Bean - トランザクション・サポート

メッセージ駆動型 Bean は、トランザクションの有効範囲内で、宛先 (またはエンドポイント) 上のメッセージを処理することができます。

IBM MQ JMS でメッセージ・リスナー・サービスを使用した場合のトランザクション処理

選択したメッセージ駆動型 Bean デプロイメント記述子設定に基づくケースが、3 つ考えられます。 コンテナー管理トランザクション (必須)、 コンテナー管理トランザクション (サポート対象外)、 および 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 の宛先からの メッセージ使用量は含まれません。 この場合は、コンテナー管理トランザクション (必須) のシナリオを使用してください。

メッセージ送信

前述の 3 つのケースそれぞれにおいて、メッセージ駆動型 Bean の宛先にロールバックされたメッセージは、最終的に再ディスパッチされます。元のロールバックの原因が一時的なシステムの問題であった場合は、このメッセージによってメッセージ駆動型 Bean が再ディスパッチされ、それが成功することが予想されます。ただし、ロールバックの原因が特定のメッセージに関する問題であった場合、 メッセージは繰り返しロールバックされ、再ディスパッチされます。 これは、有害メッセージ・シナリオと呼ばれます。

メッセージング・システムがリスナー・ポートを使用する場合、アプリケーション・サーバーは、特定のメッセージのディスパッチ頻度をトラッキングし、指定した回数のそのメッセージの再送信が試行された後に関連したリスナー・ポートを停止することによって、このシナリオを処理します。

メッセージング・システムがリスナー・ポートを使用する場合、以下のプロパティーを構成することによって有害メッセージ・シナリオを回避できます。
最大再試行数
最大再試行数」パラメーターでは、リスナーが停止する前にこのリスナーがメッセージ駆動型 Bean インスタンスに特定のメッセージの配信を試行する回数を指定します。
このパラメーターが 0 に設定された場合、メッセージが一度でも正常に配信されなければ、リスナー・ポートが停止します。
このプロパティーについて詳しくは、リスナー・ポート設定を参照してください。

メッセージング・システムがアクティベーション・スペックを使用する場合、有害メッセージ・シナリオは少し異なる方法で処理されます。 リスナー・ポートが、特定のメッセージが失敗して再配信される回数をトラッキングするのに対して、アクティベーション・スペックは、連続したメッセージ配信失敗の回数をカウントします。

メッセージング・システムがデフォルトのメッセージング・プロバイダー (サービス統合) を使用する場合は、アクティベーション・スペックで以下のプロパティーを構成して有害メッセージ・シナリオを回避する必要があります。
繰り返されるメッセージの障害時にエンドポイントを自動停止する
このオプションが選択されていることを確認してください。
このプロパティーは、「連続障害メッセージのしきい値」に達した時に、エンドポイントへのメッセージ配信を中断します。
連続障害メッセージのしきい値
このパラメーターにより、メッセージ配信が中断する前に失敗するメッセージ配信数が決まります。
このパラメーターを使用可能にするには、「繰り返されるメッセージの障害時にエンドポイントを自動停止する」オプションが選択されている必要があります。
障害のあるメッセージの再試行間の遅延
このパラメーターでは、正常に配信できなかったメッセージが再配信される前に経過する時間を指定します。
このパラメーターに 0 を指定すると、メッセージが再配信される前に遅延は発生しません。
このパラメーターを使用可能にするには、「繰り返されるメッセージの障害時にエンドポイントを自動停止する」オプションが選択されている必要があります。
これらのプロパティーについて詳しくは、JMS アクティベーション・スペック [設定]を参照してください。
メッセージング・システムが IBM MQ メッセージング・プロバイダーを使用する場合は、アクティベーション・スペックで以下のプロパティーを構成して有害メッセージ・シナリオを回避する必要があります。
メッセージ配信に失敗した場合にエンドポイントを停止 (Stop endpoint if message delivery fails)
このオプションが選択されていることを確認してください。
このプロパティーは、「エンドポイントを中断するまでの連続した送達失敗の回数」に達した時に、エンドポイントへのメッセージ配信を中断します。
エンドポイントを中断するまでの連続した送達失敗の回数 (Number of sequential delivery failures before suspending endpoint)
このパラメーターにより、メッセージ配信が中断する前に失敗するメッセージ配信数が決まります。
このパラメーターを使用可能にするには、「メッセージ配信に失敗した場合にエンドポイントを停止」オプションが選択されている必要があります。
これらのプロパティーについて詳しくは、『IBM MQ メッセージング・プロバイダー ・アクティベーション・スペックの拡張プロパティー』を参照してください。

有害メッセージ・シナリオが発生した場合に、アプリケーション・サーバーに依存してリスナー・ポートまたはアクティベーション・スペックを停止する代わりに、IBM MQ を構成して問題を解決することができます。 キュー宛先については、IBM MQ 内のキュー・オブジェクトで、バックアウト・キュー (BOQUEUE) とバックアウトしきい値 (BOTHRESH) を指定します。トピック宛先では、IBM MQ システム・キューの SYSTEM.DURABLE.MODEL.QUEUE および SYSTEM.NDURABLE.MODEL.QUEUE に対して、バックアウト・キュー (BOQUEUE) とバックアウトしきい値 (BOTHRESH) を指定します。これを行うと、IBM MQ によって有害メッセージが処理されます。 有害メッセージの処理について詳しくは、IBM MQ ライブラリーの、IBM MQ の『Java™ の使用』セクションを参照してください。


トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cmb_trans
ファイル名:cmb_trans.html