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が返されるまで繰り返されます。