[AIX Solaris HP-UX Linux Windows][IBM i]

非 ASF モードでのメッセージの処理方法

非 ASF モードでは、スレッドは、リスナー・ポートが開始した瞬間からアクティブになります。 アクティブなスレッドの数は、「最大セッション数」で指定された値によって決まります。 「最大セッション数」で指定されたスレッドの数は、処理可能なメッセージの数に関係なくアクティブです。 アクティブなスレッドはそれぞれ個別の物理ネットワーク接続となります。

IBM MQ バージョン 7.0 以降をメッセージング・プロバイダーとして使用する場合、最大 10 個までのスレッドで単一の物理ネットワーク接続を共有させることが可能です。

WebSphere® Application Server バージョン 7 以降では、リスナー・ポートは安定化されています。詳しくは、安定化されたフィーチャーに関する項目を参照してください。リスナー・ポートを使用する WebSphere MQ メッセージ駆動型 Bean のデプロイメント構成を、アクティベーション・スペックを使用する構成に移行する準備を行う必要があります。[AIX Solaris HP-UX Linux Windows][IBM i]非 ASF モードのアクティベーション・スペックの構成方法について詳しくは 『非 ASF モードのアクティベーション・スペックの構成』を参照してください。 ただし、アプリケーションを WebSphere Application Server バージョン 7 より前のアプリケーション・サーバーで実行する必要がないと確認するまでは、このマイグレーションを開始しないでください。例えば、1 つのアプリケーション・サーバー・クラスターにバージョン 6.1 のメンバーとそれより新しいバージョンのメンバーがある場合は、クラスター内のすべてのアプリケーション・サーバーをその新しいバージョンにマイグレーションするまでは、そのクラスター上のアプリケーションを、アクティベーション・スペックを使用するようにマイグレーションしないでください。

非 ASF モードでのメッセージ処理

非 ASF モードをアクティブ化するには、NON.ASF.RECEIVE.TIMEOUT メッセージ・リスナー・サービス・カスタム・プロパティーにゼロ以外の値を指定します。「NON.ASF.RECEIVE.TIMEOUT」は、ASF モードをオフにするスイッチとして機能し、さらに receive() メソッドのタイムアウト値としても機能します。

注: 以下のメッセージ・リスナー・サービスのカスタム・プロパティーは、非 ASF モードでは機能しません。
  • SERVER.SESSION.POOL.REAP
  • SERVER.SESSION.POOL.UNUSED.TIMEOUT
  • SERVER.SESSION.POOL.UNUSED.TIMEOUT.Ipaname

以下の図に、非 ASF モードにおいて WebSphere Application ServerIBM MQ 間でメッセージ処理がどのように行われるのかを示します。

図 1. 非 ASF モードでのメッセージ処理
[AIX Solaris HP-UX Linux Windows][IBM i]この図は、周囲のテキストで説明されています。
図に示されているように、メッセージ・リスナー・サービスが非 ASF モードで動作しているときには、メッセージは、以下のように処理されます。
  1. リスナー・ポートが開始されると、このポートはメッセージ・リスナー・サービス・スレッド・プールから 1 つのスレッドを取得します。
  2. リスナー・ポートはこのスレッド上で IBM MQ キュー・マネージャーへの接続を開き、JMS メッセージ・コンシューマーを作成します。 メッセージ・コンシューマーは、リスナー・ポートが listen するように構成された JMS 宛先を listen します。
  3. リスナー・ポートが、メッセージ処理を管理するトランザクションを作成します。
  4. スレッドがメッセージ・コンシューマー上で receive() メソッドを呼び出して、宛先でのメッセージを listen します。 receive() メソッドが「NON.ASF.RECEIVE.TIMEOUT」で指定された時間内にメッセージを検出しなかった場合、アプリケーション・サーバーはアクティブなトランザクションをロールバックし、新しいトランザクションを開始します。 次に、スレッドが receive() メソッドの呼び出しを再度開始します。
  5. メッセージ・コンシューマーがメッセージを検出すると、このメッセージがリスナー・ポートを使用している MDB に適しているかどうかを検査します。
  6. メッセージが適している場合、receive() メソッドは宛先からそのメッセージを取り出してスレッドに送ります。
  7. スレッドがメッセージ・コンシューマー上で MDB の onMessage() メソッドを呼び出し、メッセージが処理されます。
  8. メッセージが正常に処理を完了すると、トランザクションはコミットされます。 メッセージが正常に処理されない場合、トランザクションはロールバックされます。
  9. 新しいトランザクションが開始され、メッセージ・コンシューマーが receive() メソッドを呼び出して新しいメッセージの listen を行います。
MDB が同時に処理できるスレッドの数は、リスナー・ポートの「最大セッション数」プロパティーの値によって決まります。「最大セッション数」をデフォルト値の 1 に設定した場合は、MDB は一度に 1 つのメッセージのみを処理できます。「最大セッション数」1 より大きい値に設定することで、ASF モードで複数のメッセージを同時に処理できます。 例えば、「最大セッション数」2 に設定した場合は、メッセージは、以下のように処理されます。
  1. リスナー・ポートが開始されると、このポートはメッセージ・リスナー・サービス・スレッド・プールから 2 つのスレッドを取得します。
  2. リスナー・ポートが各スレッドに 1 つのメッセージ・コンシューマーとトランザクションを作成します。 メッセージ・コンシューマーは、リスナー・ポートが listen するように構成された宛先を listen します。
  3. これらのメッセージ・コンシューマーは両方とも receive() メソッドを呼び出して、宛先にあるメッセージを listen します。 これらのコンシューマーは、宛先からメッセージを取得するために競合します。
  4. いずれかのコンシューマーがメッセージを正常に取得すると、このコンシューマーは MDB の onMessage() メソッドを呼び出してこれを処理します。 他のメッセージ・コンシューマーは receive() メソッドの呼び出しを継続して、宛先にあるメッセージを listen します。

不要なトランザクション・タイムアウトを回避する方法

メッセージング・システムが非 ASF モードで稼働している場合は、 不要なトランザクション・タイムアウトが発生しないように、合計トランザクション存続時間タイムアウトに達する前に処理が完了できる十分な時間を割り当ててください。 そのため、必ず、 NON.ASF.RECEIVE.TIMEOUT メッセージ・リスナー・サービス・カスタム・プロパティーに指定した値が、 トランザクション・サービス・プロパティーの「合計トランザクション存続時間タイムアウト」に指定した値より小さく、 かつ、この 2 つのプロパティーの値の差が、メッセージ駆動型 Bean (MDB) の onMessage() メソッドでメッセージの処理にかかる時間より大きくなるようにしてください。

以下の例に示すように、これらのプロパティーが正しく構成されていない場合、トランザクションは完了する前にタイムアウトになる可能性があります。これは、トランザクションが作成されると直ちにスレッドが receive() メソッドの呼び出しを開始するためです。 以下の例は、「NON.ASF.RECEIVE.TIMEOUT」が 110000 ミリ秒 (110 秒) に設定され、「合計トランザクション存続時間タイムアウト」が 120 秒に設定され、MDB の onMessage () メソッドが 15 秒でメッセージを処理したものです。この例では、receive() メソッドがタイムアウト間近になるまでメッセージが宛先に表示されないことを想定しています。
  1. リスナー・ポートが開始します。このポートはスレッド・プールからスレッドを割り振り、そのスレッド上にトランザクションとメッセージ・コンシューマーを作成します。
  2. スレッドが receive() メソッドを呼び出してメッセージを listen します。
  3. 110 秒後に、メッセージが宛先に到着します。
  4. スレッドはそのメッセージを宛先から削除し、MDB の onMessage() メソッドを呼び出してメッセージの処理を開始します。
  5. 10 秒後、トランザクションがタイムアウトに達します。アプリケーション・サーバーがトランザクションにロールバックのマークを付けます。
  6. 5 秒後、onMessage() メソッドがメッセージの処理を完了し、トランザクションのコミットを試行します。
  7. トランザクションの開始から経過した時間の合計は 125 秒です (メッセージ待機時間 110 秒とメッセージ処理時間 15 秒)。 この時間がトランザクションのタイムアウトよりも長い場合、アプリケーション・サーバーでトランザクションはコミットされず、ロールバックされます。

不要なトランザクションのタイムアウトを回避するように「NON.ASF.RECEIVE.TIMEOUT」および「合計トランザクション存続時間タイムアウト」のプロパティーを構成する方法について詳しくは、関連タスクを参照してください。


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



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