2.3.2 メッセージ取り出しモード
キューの作成時には,次のようにメッセージ取り出しモードを指定できます。
-
永続版リソースアダプタの場合
hrmmkqueコマンドの-dオプションにメッセージ取り出しモードを指定して,コマンドを実行します。
-
非永続版リソースアダプタの場合
キュー定義文の-dオプションにメッセージ取り出しモードを指定して,キュー作成ファイルを作成します。
メッセージ取り出しモードには次に示す属性があり,アプリケーションがキューからメッセージを受信するときの多重化制御が異なります。
-
アプリケーションがトランザクション内でキューからメッセージを受信したあと,トランザクションが未決着な状態であるとき,異なるアプリケーション(または異なるスレッドのトランザクション)での次メッセージの取り出しが抑止されます。トランザクションが決着してから受信できるようになります。
つまり,同一トランザクション内でのメッセージの連続的な受信だけができます。
複数のアプリケーション(または複数のスレッドのトランザクション)でメッセージを受信する場合に,メッセージが送信されたときの順序を保持する必要があるときに指定します。
シリアル取り出し属性の概要を次の図に示します。
図2‒10 シリアル取り出し属性の概要 -
パラレル取り出し属性(-dオプションにparallelを指定)
アプリケーションがトランザクション内でキューからメッセージを受信したあと,トランザクションが未決着な状態であるとき,異なるアプリケーション(または異なるスレッドのトランザクション)での次メッセージの受信ができます。
複数のアプリケーション(または複数のスレッドのトランザクション)でメッセージを受信する場合に,メッセージが送信されたときの順序を保持する必要がないときに指定します。シリアル取り出し属性よりもメッセージ受信時のスループットが優れます。
パラレル取り出し属性の概要を次の図に示します。
図2‒11 パラレル取り出し属性の概要 -
パラレル取り出し属性(ただし,同一ユニット識別子の配信順序制御)(-dオプションにparallel_unit_orderを指定)
MDBへのメッセージ配信時に,アプリケーションで設定したメッセージのユニット識別子ごとに順序性を保証します。キューに含まれる特定のメッセージ間では順序性を保証し,それ以外の場合には多重度を確保してMDBを実行できます。
ユニット識別子での配信順序制御では,MDBへのメッセージ配信時にメッセージのユニット識別子を調べ,配信中のメッセージと同一のユニット識別子の場合はメッセージを配信しないように抑止します。この場合,同一MDBの他のスレッドに対してもメッセージの配信は抑止されます。配信が抑止されたメッセージは,MDBで行っているメッセージ配信が完了すると配信対象となります。
配信中のメッセージとは異なるユニット識別子が設定されたメッセージがキューに存在すれば,そのメッセージは配信されます。また,ユニット識別子が設定されていないメッセージも抑止されずに配信されます。
ユニット識別子の配信順序制御はMDBに対してのみ有効です。アプリケーションからメッセージを送受信する場合は,パラレル取り出し属性と同じ振る舞いとなります。
ユニット識別子の配信順序制御の概要を次の図に示します。
図2‒12 ユニット識別子の配信順序制御の概要
(1) ユニット識別子の設定
アプリケーションは送信対象のメッセージに対して,Reliable Messaging固有のプロパティJMS_HITACHI_UnitID(String型)を利用して,メッセージのユニット識別子を設定できます。
ユニット識別子のプロパティ名は大文字小文字を区別します。プロパティ名,型を間違えて設定した場合,アプリケーション指定のプロパティとして扱われます。この場合,ユニット識別子による配信順序制御は行われません。また,空文字やNULLをメッセージ識別子として設定した場合も,メッセージはユニット識別子による配信順序制御の対象とはなりません。
キューに格納されたメッセージのユニット識別子は,メッセージの表示コマンドで参照できます。コマンドの詳細については,「8. コマンドリファレンス」を参照してください。
(2) キューのメッセージ取り出しモードの設定
ユニット識別子による配信順序制御は,キューの作成時にメッセージ取り出しモードとして指定できます。ただし,キューの永続性が非永続キュー属性である必要があります。永続属性のキューに対して,-dオプションとしてparallel_unit_orderを指定すると例外が発生し,キューの作成に失敗します。
また,キューの属性変更コマンドを利用して,キューの取り出しモードをパラレル取り出し属性(ただし,同一ユニット識別子の配信順序制御)に変更することもできます。
(3) 注意事項
-
シリアル/パラレルのメッセージ取り出しモードの場合は,ユニット識別子が指定されていてもMDBへの配信でユニット識別子による配信順序制御は行われません。
-
ユニット識別子が設定されない,あるいは,空文字/NULLが指定されている場合,メッセージはパラレル取り出しにより,MDBに配信されます。
-
以下の場合,取り出しモードがユニット識別子による配信順序制御で,メッセージにユニット識別子が付与されていてもユニット識別子による配信順序制御は行われません。
-
メッセージがキュー間転送機能によってキューに格納された場合
-
キューがデッドメッセージキューである場合
-
メッセージがデッドメッセージの再登録によって,キューに格納された場合
これらの場合,メッセージにユニット識別子が指定されていると,メッセージのプロパティにはユニット識別子は含まれますが,メッセージはパラレル取り出しにより,MDBに配信されます。
また,メッセージの参照コマンドを実行した場合,デッドメッセージキューおよびデッドメッセージを再登録したメッセージについては,ユニット識別子は表示されません。
転送機能によってメッセージがキューに格納された場合,メッセージのユニット識別子はメッセージの参照コマンドで参照できますが,ユニット識別子による配信順序制御の対象とはなりません。
-