![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
非 ASF モードでのメッセージの処理方法
非 ASF モードでは、スレッドは、リスナー・ポートが開始した瞬間からアクティブになります。 アクティブなスレッドの数は、「最大セッション数」で指定された値によって決まります。 「最大セッション数」で指定されたスレッドの数は、処理可能なメッセージの数に関係なくアクティブです。 アクティブなスレッドはそれぞれ個別の物理ネットワーク接続となります。
IBM MQ バージョン 7.0 以降をメッセージング・プロバイダーとして使用する場合、最大 10 個までのスレッドで単一の物理ネットワーク接続を共有させることが可能です。
WebSphere® Application Server バージョン 7 以降では、リスナー・ポートは安定化されています。詳しくは、安定化されたフィーチャーに関する項目を参照してください。リスナー・ポートを使用する WebSphere MQ メッセージ駆動型 Bean のデプロイメント構成を、アクティベーション・スペックを使用する構成に移行する準備を行う必要があります。非 ASF モードのアクティベーション・スペックの構成方法について詳しくは 『非 ASF モードのアクティベーション・スペックの構成』を参照してください。 ただし、アプリケーションを WebSphere Application Server バージョン 7 より前のアプリケーション・サーバーで実行する必要がないと確認するまでは、このマイグレーションを開始しないでください。例えば、1 つのアプリケーション・サーバー・クラスターにバージョン 6.1 のメンバーとそれより新しいバージョンのメンバーがある場合は、クラスター内のすべてのアプリケーション・サーバーをその新しいバージョンにマイグレーションするまでは、そのクラスター上のアプリケーションを、アクティベーション・スペックを使用するようにマイグレーションしないでください。
非 ASF モードでのメッセージ処理
非 ASF モードをアクティブ化するには、NON.ASF.RECEIVE.TIMEOUT メッセージ・リスナー・サービス・カスタム・プロパティーにゼロ以外の値を指定します。「NON.ASF.RECEIVE.TIMEOUT」は、ASF モードをオフにするスイッチとして機能し、さらに receive() メソッドのタイムアウト値としても機能します。
- SERVER.SESSION.POOL.REAP
- SERVER.SESSION.POOL.UNUSED.TIMEOUT
- SERVER.SESSION.POOL.UNUSED.TIMEOUT.Ipaname
以下の図に、非 ASF モードにおいて WebSphere Application Server と IBM MQ 間でメッセージ処理がどのように行われるのかを示します。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)

- リスナー・ポートが開始されると、このポートはメッセージ・リスナー・サービス・スレッド・プールから 1 つのスレッドを取得します。
- リスナー・ポートはこのスレッド上で IBM MQ キュー・マネージャーへの接続を開き、JMS メッセージ・コンシューマーを作成します。 メッセージ・コンシューマーは、リスナー・ポートが listen するように構成された JMS 宛先を listen します。
- リスナー・ポートが、メッセージ処理を管理するトランザクションを作成します。
- スレッドがメッセージ・コンシューマー上で receive() メソッドを呼び出して、宛先でのメッセージを listen します。 receive() メソッドが「NON.ASF.RECEIVE.TIMEOUT」で指定された時間内にメッセージを検出しなかった場合、アプリケーション・サーバーはアクティブなトランザクションをロールバックし、新しいトランザクションを開始します。 次に、スレッドが receive() メソッドの呼び出しを再度開始します。
- メッセージ・コンシューマーがメッセージを検出すると、このメッセージがリスナー・ポートを使用している MDB に適しているかどうかを検査します。
- メッセージが適している場合、receive() メソッドは宛先からそのメッセージを取り出してスレッドに送ります。
- スレッドがメッセージ・コンシューマー上で MDB の onMessage() メソッドを呼び出し、メッセージが処理されます。
- メッセージが正常に処理を完了すると、トランザクションはコミットされます。 メッセージが正常に処理されない場合、トランザクションはロールバックされます。
- 新しいトランザクションが開始され、メッセージ・コンシューマーが receive() メソッドを呼び出して新しいメッセージの listen を行います。
- リスナー・ポートが開始されると、このポートはメッセージ・リスナー・サービス・スレッド・プールから 2 つのスレッドを取得します。
- リスナー・ポートが各スレッドに 1 つのメッセージ・コンシューマーとトランザクションを作成します。 メッセージ・コンシューマーは、リスナー・ポートが listen するように構成された宛先を listen します。
- これらのメッセージ・コンシューマーは両方とも receive() メソッドを呼び出して、宛先にあるメッセージを listen します。 これらのコンシューマーは、宛先からメッセージを取得するために競合します。
- いずれかのコンシューマーがメッセージを正常に取得すると、このコンシューマーは MDB の onMessage() メソッドを呼び出してこれを処理します。 他のメッセージ・コンシューマーは receive() メソッドの呼び出しを継続して、宛先にあるメッセージを listen します。
不要なトランザクション・タイムアウトを回避する方法
メッセージング・システムが非 ASF モードで稼働している場合は、 不要なトランザクション・タイムアウトが発生しないように、合計トランザクション存続時間タイムアウトに達する前に処理が完了できる十分な時間を割り当ててください。 そのため、必ず、 NON.ASF.RECEIVE.TIMEOUT メッセージ・リスナー・サービス・カスタム・プロパティーに指定した値が、 トランザクション・サービス・プロパティーの「合計トランザクション存続時間タイムアウト」に指定した値より小さく、 かつ、この 2 つのプロパティーの値の差が、メッセージ駆動型 Bean (MDB) の onMessage() メソッドでメッセージの処理にかかる時間より大きくなるようにしてください。
- リスナー・ポートが開始します。このポートはスレッド・プールからスレッドを割り振り、そのスレッド上にトランザクションとメッセージ・コンシューマーを作成します。
- スレッドが receive() メソッドを呼び出してメッセージを listen します。
- 110 秒後に、メッセージが宛先に到着します。
- スレッドはそのメッセージを宛先から削除し、MDB の onMessage() メソッドを呼び出してメッセージの処理を開始します。
- 10 秒後、トランザクションがタイムアウトに達します。アプリケーション・サーバーがトランザクションにロールバックのマークを付けます。
- 5 秒後、onMessage() メソッドがメッセージの処理を完了し、トランザクションのコミットを試行します。
- トランザクションの開始から経過した時間の合計は 125 秒です (メッセージ待機時間 110 秒とメッセージ処理時間 15 秒)。 この時間がトランザクションのタイムアウトよりも長い場合、アプリケーション・サーバーでトランザクションはコミットされず、ロールバックされます。
不要なトランザクションのタイムアウトを回避するように「NON.ASF.RECEIVE.TIMEOUT」および「合計トランザクション存続時間タイムアウト」のプロパティーを構成する方法について詳しくは、関連タスクを参照してください。