Hitachi

OpenTP1 Version 7 OpenTP1 メッセージキューイング機能 TP1/Message Queue プログラム作成の手引


10.9 論理的順序でのメッセージ検索

キューにあるメッセージの順序には,論理的順序と物理的順序があります。詳細については,「10.3.2 論理的順序と物理的順序」を参照してください。この順序はメッセージの検索時には特に重要です。一般的には,メッセージは削除されないで,検索は必ずしもキューの最初から開始しないためです。アプリケーションで一つのグループの複数のメッセージを論理的順序で一とおり検索する場合には,次のグループの最初のメッセージが後続するようにしてください。一つのグループの最後のメッセージが,物理的には次のグループの最初のメッセージのあとになる可能性があります。MQGMO_LOGICAL_ORDERはキューを調べるときに論理的順序に従うことを指定します。

検索時のMQGMO_ALL_MSGS_AVAILABLEまたはMQGMO_ALL_SEGMENTS_AVAILABLEは注意して使用してください。ここでは,MQGMO_ALL_MSGS_AVAILABLEの論理メッセージについて説明します。このオプションの機能は,グループ内のメッセージの残りがすべてある場合にだけ論理メッセージを利用できるようにすることです。残りがそろわない場合にはメッセージは渡されません。つまり,転送されなかったメッセージがあとから到着したときにはMQGMO_BROWSE_NEXTで通知されません。

例えば,次に示す論理メッセージがあるとします。

グループ123の論理メッセージ1(最後でない)
グループ456の論理メッセージ1(最後でない)
グループ456の論理メッセージ2(最後)

ここでMQGMO_ALL_MSGS_AVAILABLEの検索が発行されたとします。このときグループ456の論理メッセージ1が返され,検索カーソルはこの論理メッセージ上に残ります。そして,グループ123の論理メッセージ2(最後)が到着したとします。

グループ123の論理メッセージ1(最後でない)
グループ123の論理メッセージ2(最後)
グループ456の論理メッセージ1(最後でない) <== 検索カーソル
グループ456の論理メッセージ2(最後)

ここでMQGMO_BROWSE_NEXTの検索が発行されても,グループ123がそろっていることは検出されません。グループの最初のメッセージが検索カーソルの前にあるからです。

グループが完全なときにメッセージを削除しながら取り出す場合などには,MQGMO_ALL_MSGS_AVAILABLEをMQGMO_BROWSE_FIRSTとともに使用できます。しかし,読み飛ばした到着メッセージを検出するには,検索を繰り返さなければなりません。MQGMO_WAITをMQGMO_BROWSE_NEXTおよびMQGMO_ALL_MSGS_AVAILABLEとともに発行するだけでは不十分です。同様のことは,メッセージの検索後に,より高い優先度のメッセージが到着した場合にも発生します。

〈この節の構成〉