Hitachi

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


10.9.2 削除しながらの取り出し

ここでは,グループを削除しながら取り出すか決定する前に,アプリケーションでグループ内の各論理メッセージを検索する例を示します。

この例ではグループ全体の検索が終わると,最初に戻ってメッセージを削除しながら取り出します。

この例では各グループを削除するので,グループ内の最初または唯一のメッセージを検索するときには,MQGMO_LOGICAL_ORDERは使用できません。

検索と削除しながらの取り出しの例について,次に示します。

GMO.Options = MQGMO_BROWSE_NEXT | MQGMO_COMPLETE_MSG
            | MQGMO_LOGICAL_ORDER
            | MQGMO_ALL_MSGS_AVAILABLE | MQGMO_WAIT
while ( GroupStatus == MQGS_MSG_IN_GROUP ) {
  MQGET
  /* グループ内の残りのメッセージを調査
     (または削除しながら取り出すか決定するのに
       必要なだけ調査)*/
  ...
}
 
if ( 削除しながらグループを取り出す )
  if ( GroupStatus == ' ' )
    /* グループ化されないメッセージの取り出し */
    GMO.Options = MQGMO_MSG_UNDER_CURSOR | MQGMO_SYNCPOINT
    MQGET GMO.MatchOptions = 0
    /* メッセージの処理 */
    ...
  else
    /* 一つ以上のメッセージを取り出しました。検索カーソルは通常は
       グループの最初にはありません。そのため,GroupIdを設定し,
       MsgSeqNumberに1を設定します。
       グループ化の有無に影響されないほかの方法では,検索時に
       最初のメッセージのMsgIdを保存し,それを設定します。 */
    GMO.Options = MQGMO_COMPLETE_MSG | MQGMO_SYNCPOINT
    MQGET GMO.MatchOptions = MQMO_MATCH_GROUP_ID
                           | MQMO_MATCH_MSG_SEQ_NUMBER,
         (MQMD.GroupId = メッセージ記述子に既存の値)
          MQMD.MsgSeqNumber = 1
    /* 最初または唯一のメッセージの処理 */
    ...
    GMO.Options = MQGMO_COMPLETE_MSG | MQGMO_SYNCPOINT
                | MQGMO_LOGICAL_ORDER
    while ( GroupStatus == MQGS_MSG_IN_GROUP ) {
      MQGET
      /* グループ内の残りメッセージの処理 */
      ...
    }