Hitachi

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


10.9.1 グループ内のメッセージ検索

ここでは,キューの各メッセージを論理的順序で一とおり検索する例を示します。

キューのメッセージはグループ化されていたり,されていなかったりします。グループ化されたメッセージには,グループ内のすべてのメッセージが到着するまで,アプリケーションでグループの処理を開始させたくないことがあります。そのときはMQGMO_ALL_MSGS_AVAILABLEをグループの最初のメッセージに指定します。グループ内の以降のメッセージには,このオプションは不要です。

この例ではMQGMO_WAITを使用します。待ち合わせは新規グループが到着すると完了します。ただし,検索カーソルがグループ内の最初の論理メッセージを過ぎていると残りのメッセージが到着しても,完了しません。また,一定間隔で待ち合わせることによって,新規メッセージまたはセグメントを待つ間にアプリケーションがループに入ったままにならないようにできます。

論理的順序の検索を指定するために,最初から最後までMQGMO_LOGICAL_ORDERを使用します。これはメッセージを削除するMQGET命令の例とは異なる点です。メッセージを削除するMQGET命令の例では各グループが削除されるので,グループ内の最初または唯一のメッセージを検索するときにMQGMO_LOGICAL_ORDERは使用しません。

アプリケーションのバッファは,メッセージのセグメント分割の有無に関係なく,メッセージ全体を保持するのに十分な大きさがあるとします。そのためMQGET命令にはMQGMO_COMPLETE_MSGを指定します。

グループ内の論理メッセージの検索の例について,次に示します。

/* グループ内の最初のメッセージ,
   またはグループにないメッセージの検索 */
GMO.Options = MQGMO_BROWSE_NEXT | MQGMO_COMPLETE_MSG
            | MQGMO_LOGICAL_ORDER | MQGMO_ALL_MSGS_AVAILABLE
            | MQGMO_WAIT
MQGET GMO.MatchOptions = MQMO_MATCH_MSG_SEQ_NUMBER,
      MD.MsgSeqNumber = 1
/* 最初または唯一のメッセージの確認 */
...
GMO.Options = MQGMO_BROWSE_NEXT | MQGMO_COMPLETE_MSG
            | MQGMO_LOGICAL_ORDER
while ( GroupStatus == MQGS_MSG_IN_GROUP ) {
  MQGET
  /* グループ内の残りのメッセージの確認 */
  ...
}

上記の検索はMQRC_NO_MSG_AVAILABLEが返されるまで繰り返されます。