• 検索結果がありません。

MQGMO_LOGICAL_ORDER

ドキュメント内 TP1/Message Queue プログラム作成リファレンス (ページ 61-66)

グループ内のメッセージや論理メッセージのセグメントを論理的な順序で返します。

キューハンドルに対し,成功した MQGET 命令によって返されるメッセージの順序を制御します。こ のオプションは,おのおのの命令に指定した場合に有効となります。

キューハンドルに対する MQGET 命令が成功した場合,MQGMO_LOGICAL_ORDER が指定されて いると,グループ内のメッセージはメッセージシーケンス番号の順序で返されます。また,論理メッ セージのセグメントは,セグメントオフセットの順序で返されます。この順序は,メッセージとセグメ ントのキュー内での位置には関係ありません。

キューマネジャは要求された順序でメッセージを返すために,成功した MQGET 命令間でのグループ とセグメントの情報を保持しています。この情報で,キューハンドルに対する現在のメッセージグルー プと現在の論理メッセージとその位置,およびメッセージが同期点で取り出されているかどうかを識別 します。キューマネジャがこの情報を保持しているため,アプリケーションはそれぞれの MQGET 命 令に先立って,グループとセグメントの情報を指定する必要はありません。つまり,アプリケーション は MQMD 構造体の GroupId フィールドや MsgSeqNumber フィールド,および Offset フィールド を指定する必要はありません。ただし,アプリケーションはそれぞれの命令で MQGMO_SYNCPOINT または MQGMO_NO_SYNCPOINT オプションを正しく指定しなければなりません。

キューのオープン時,現在のメッセージグループおよび現在の論理メッセージは存在しません。

MQMF_MSG_IN_GROUP フラグが設定されたメッセージが MQGET 命令で返された場合は,その メッセージグループが現在のメッセージグループとなります。成功した MQGET 命令で指定された MQGMO_LOGICAL_ORDER によって次に示すどちらかのメッセージが返されるまで,そのグルー プが現在のグループとなります。

• MQMF_SEGMENT なしの MQMF_LAST_MSG_IN_GROUP

(グループ内のセグメント分割されていない最終論理メッセージ)

• MQMF_LAST_SEGMENT ありの MQMF_LAST_MSG_IN_GROUP

(グループ内の最終論理メッセージの最終セグメント)

上記のメッセージが返されると,メッセージグループは終了し,MQGET 命令の成功で現在のグルー プは存在しなくなります。同様に,論理メッセージは,MQGET 命令で MQMF_SEGMENT フラグが 設定されたメッセージが返されたときに現在の論理メッセージとなります。MQMF_LAST_SEGMENT フラグを持つメッセージが返されると,現在の論理メッセージは終了します。

何も選択されない場合,成功した MQGET 命令は,キューの最初にあるメッセージグループのメッセー ジ,2 番目にあるメッセージグループのメッセージの順に,有効なメッセージがなくなるまで正しい順 序で返します。このとき,MatchOptions フィールドに,次に示すオプションを一つ以上指定するこ とで,特定のメッセージグループを選択できます。

• MQMO_MATCH_MSG_ID

• MQMO_MATCH_CORREL_ID

• MQMO_MATCH_GROUP_ID

ただし,これらのオプションは,現在のメッセージグループまたは現在の論理メッセージが存在しない ときだけ有効となります。詳細については,「MatchOptions フィールド」を参照してください。

MQGET 命令が返すメッセージの検索時に,キューマネジャが参照する MsgId フィールド,CorrelId フィールド,GroupId フィールド,MsgSeqNumber フィールド,および Offset フィールドの値を次 の表に示します。この値は,キューからメッセージを取り出すときと,キューのメッセージを参照する ときの両方に適用されます。

指定した オプション

命令に先行するグループ と論理メッセージの状態

キューマネジャが検索する値

MQGMO_

LOGICAL_

ORDER

命令に先行す る現在のメッ セージグルー プ

がある

命令に先行す る現在の論理 メッセージが ある

Msg Id フィー ルド

Correl Id フィー ルド

Group Id フィー ルド

MsgSeq Number フィールド

Offset フィールド

○ × × Match

Options で 制御される

Match Options で 制御される

Match Options で 制御される

1 0

○ × ○ メッセージ

識別子

相関識別子 グループ識 別子

1 先行するオ

フセット値 とセグメン ト長の和

○ ○ × メッセージ

識別子

相関識別子 グループ識 別子

シーケンス 番号+ 1

0

○ ○ ○ メッセージ

識別子

相関識別子 グループ識 別子

シーケンス 番号

先行するオ フセット値 とセグメン ト長の和

× − − Match

Options で 制御される

Match Options で 制御される

Match Options で 制御される

Match Options で 制御される

Match Options で 制御される

(凡例)

○:該当します。

×:該当しません。

−:有無に関係ありません。

注※

キューハンドルに対する前の命令で返された値です。

複数のメッセージグループがキューに存在する場合,各グループの最初の論理メッセージの先頭セグメ ントがキュー内のどこに位置するかによって,メッセージの返される順序が決まります。つまり,メッ セージシーケンス番号が 1 でオフセットが 0 である物理メッセージによって,メッセージが返される ときの順序が決まります。

MQGMO_LOGICAL_ORDER オプションは次に示すように,同期点に影響を及ぼします。

• グループの最初の論理メッセージまたはセグメントがトランザクション内で取り出された場合で,

同じキューハンドルを使うときは,そのグループにあるほかのすべての論理メッセージとセグメン トが,トランザクション内で取り出されなければなりません。しかし,それらのメッセージが同じ トランザクション内で取り出される必要はありません。これによって,多くの物理メッセージで構 成されるメッセージグループは,そのキューハンドルで二つ以上の連続したトランザクションに分 割できます。

• グループの最初の論理メッセージまたはセグメントがトランザクション内で取り出されなかった場 合で,同じキューハンドルを使うときは,そのグループのほかの論理メッセージとセグメントは,

トランザクション内で取り出せません。

これらの条件が満たされなかった場合,MQGET 命令は理由コード MQRC_INCONSISTENT_UOW で失敗となります。MQGMO_LOGICAL_ORDER が指定されたとき,MQGET 命令で指定された MQGMO 構造体は,MQGMO_VERSION_2 より前のバージョンではいけません。また,MQMD 構 造体は MQMD_VERSION_2 より前のバージョンではいけません。この条件が満たされない場合,理 由コード MQRC_WRONG_GMO_VERSION または MQRC_WRONG_MD_VERSION で失敗とな ります。

キューハンドルで MQGET 命令に MQGMO_LOGICAL_ORDER が指定されない場合,メッセージ はメッセージグループまたは論理メッセージのセグメントに属しているかどうかに関係なく返されま す。これは,特定のグループまたは論理メッセージから,メッセージまたはセグメントが順序に従わな いで返されることを示します。または,メッセージやセグメントが,ほかのグループや論理メッセージ からのメッセージ,セグメント,およびグループに属していないセグメントのメッセージと混在してい ることを示しています。この場合,MQGET 命令で返される特定のメッセージは,それぞれの命令で 指定される MQMO_*オプションで制御されます。詳細については,「MatchOptions フィールド」を 参照してください。

システムに障害が起きた場合は,次に示す方法でメッセージグループや論理メッセージを途中から再開 できます。システム再開時,アプリケーションは GroupId フィールド,MsgSeqNumber フィールド,

Offset フィールド,および MatchOptions フィールドに適当な値を設定します。その後,

MQGMO_SYNCPOINT または MQGMO_NO_SYNCPOINT に適当な値を設定します。これによっ て,MQGMO_LOGICAL_ORDER を指定しないで MQGET 命令を発行できるようになります。この MQGET 命令が成功したとき,キューマネジャはグループとセグメントの情報を保持できます。した がって,そのキューハンドルを使用した次の MQGET 命令では,通常の

MQGMO_LOGICAL_ORDER を指定できます。

キューマネジャが MQGET 命令用に保持しているグループとセグメントの情報は,MQPUT 命令用に 保持しているグループとセグメントの情報とは別です。さらに,キューマネジャは,次に示す命令につ いて別の情報を保持しています。

• キューからメッセージを取り出す MQGET 命令

• キューのメッセージを参照する MQGET 命令

どのキューハンドルについても,アプリケーションは MQGMO_LOGICAL_ORDER を指定した MQGET 命令と,指定しない MQGET 命令を混在させてもかまいません。ただし,次の点に注意して ください。

• MQGMO_LOGICAL_ORDER を指定していない場合,MQGET 命令が成功するたびに,キュー マネジャは返されたメッセージに対応する値を,保持しているグループおよびセグメント情報に設 定します。その情報で,キューハンドルに対してキューマネジャが保持していたグループとセグメ ントの情報を置き換えます。そのとき,参照または取り出し命令の動作に必要な情報だけが変更さ れます。

• MQGMO_LOGICAL_ORDER が指定されない場合,現在のメッセージグループまたは論理メッ セージが存在するとき,その命令は失敗しません。命令は完了コード MQCC_WARNING で成功 します。

グループおよびセグメントの情報と一致しない MQGET 命令および MQCLOSE 命令の結果を次の 表に示します。

実行時の命令 直前の命令が

MQGMO_LOGICAL_ORDER 指定あ りの MQGET 命令

直前の命令が

MQGMO_LOGICAL_ORDER 指定な しの MQGET 命令

MQGMO_LOGICAL_ORDER 指定あり の MQGET 命令

MQCC_FAILED MQCC_FAILED

MQGMO_LOGICAL_ORDER 指定なし の MQGET 命令

MQCC_WARNING MQCC_OK

非永続グループ,または論理メッセージ のある MQCLOSE 命令

MQCC_WARNING MQCC_OK

上記の表の場合で,完了コードが MQCC_OK 以外のとき,理由コードは次のどれかになります。

MQRC_INCOMPLETE_GROUP MQRC_INCOMPLETE_MSG MQRC_INCONSISTENT_UOW

注意事項

キューマネジャは,参照するためにオープンされていますが,入力用にオープンされていな いキューを参照したり,クローズしたりした場合には,グループとセグメントの情報をチェッ クしません。この場合,完了コードは常に MQCC_OK(ほかのエラーがない場合)となり ます。

論理的な順序でメッセージとセグメントを取り出したいアプリケーションでは,

MQGMO_LOGICAL_ORDER を指定することをお勧めします。このオプションを指定すると,キュー マネジャがグループとセグメントの情報を管理するため,アプリケーションではキューマネジャとセグ メントの情報を管理する必要がありません。しかし,アプリケーションによっては,

MQGMO_LOGICAL_ORDER オプションが提供する機能より高い制御機能を必要とする場合があり ます。その場合,MQGMO_LOGICAL_ORDER オプションを指定しないでください。

MQGMO_LOGICAL_ORDER を指定しなかったとき,アプリケーションは,MQGET 命令に先立っ て,MQMD 構造体の MsgId フィールド,CorrelId フィールド,GroupId フィールド,

MsgSeqNumber フィールド,Offset フィールド,および MQGMO 構造体の MatchOptions フィー ルドの MQMO_*オプションを正しく指定しなければなりません。

例えば,受信した物理メッセージがグループまたは論理メッセージのセグメントに属する場合でも,転 送するアプリケーションに MQGMO_LOGICAL_ORDER を指定しないでください。送信側と受信側 のキューマネジャ間に複数の通信路がある複雑なネットワークの場合,MQGMO_LOGICAL_ORDER を指定すると,物理メッセージが順序どおりに到着しません。

ドキュメント内 TP1/Message Queue プログラム作成リファレンス (ページ 61-66)