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

MQPMO_LOGICAL_ORDER

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

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

このオプションを指定すると,アプリケーションがキューマネジャにグループ内のメッセージと論理 メッセージのセグメントの登録方法を通知します。MQPUT 命令でだけ指定できます。MQPUT1 命 令で指定すると不正となります。

MQPMO_LOGICAL_ORDER が指定されると,アプリケーションは MQPUT 命令を次のように発行 します。

• 各論理メッセージのセグメントを,セグメントオフセットが 0 から空きがなくなるまで,昇順で登 録します。

• 論理メッセージの全セグメントを,次の論理メッセージのセグメント登録の前に登録します。

• 各メッセージグループの論理メッセージを,メッセージシーケンス番号が 1 から空きがなくなるま で,昇順で登録します。

• メッセージグループの全論理メッセージを次のメッセージグループの論理メッセージ登録の前に登 録します。

上記の順序を論理的順序といいます。

アプリケーションは,キューマネジャにグループ内のメッセージと論理メッセージのセグメントの登録 方法を通知しているため,おのおのの MQPUT 命令でグループとセグメントの情報を保持したり,更 新したりする必要がありません。特に,MQMD 構造体の GroupId フィールド,MsgSeqNumber フィールド,および Offset フィールドは,キューマネジャが適当な値に設定するため,アプリケーショ ンは設定する必要がありません。アプリケーションは,次に示す内容を指示するため,MQMD 構造体 の MsgFlags フィールドだけ指定する必要があります。

• メッセージがグループに属する,または論理メッセージのセグメントであることを指示する

• グループ内の最終メッセージ,または論理メッセージの最終セグメントを指示する

メッセージグループまたは論理メッセージが開始すると,次の MQPUT 命令は MQMD 構造体の MsgFlags フィールドに適当な MQMF_*フラグを指定する必要があります。アプリケーションが,メッ セージグループが終了していないときにグループに属さないメッセージを登録しようとしたり,論理 メッセージが終了していないときにセグメントではないメッセージを登録しようとしたりした場合,命 令は MQRC_INCOMPLETE_GROUP または MQRC_INCOMPLETE_MSG の理由コードで失敗し ます。

ただし,キューマネジャは,現在のメッセージグループおよび現在の論理メッセージに関する情報を保 持しています。アプリケーションは MQMF_LAST_MSG_IN_GROUP または

MQMF_LAST_SEGMENT を指定してメッセージを送信することで,MQPUT 命令を再発行する前に グループに属していない,かつセグメントでもないメッセージを登録するために保持されている情報を 終了できます。ただし,この場合アプリケーションが送信するメッセージには,メッセージデータがな いときもあります。

オプションとフラグの正しい組み合わせ,およびキューマネジャが使用する GroupId フィールド,

MsgSeqNumber フィールド,および Offset フィールドの値を次の表に示します。表に示されていな いオプションとフラグの組み合わせは誤りです。

指定するオプション 命令に先行するグループと

論理メッセージの状態

キューマネジャが使用する値

MQPMO_

LOG ICAL_

ORDER

MQMF_

MSG_

IN_

GROUP または MQMF_

LAST_

MSG_

IN_

GROUP

MQMF_

SEG MENT または MQMF_

LAST_

SEG MENT

MQMF_

SEG MENT ATION_

ALLO WED

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

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

Group Id

MsgSeq Number

Offset

○ × × × × × MQGI_

NONE

1 0

○ × × ○ × × 新グループ

識別子

1 0

○ × ○ − × × 新グループ

識別子

1 0

○ × ○ − × ○ 前グループ

識別子

1 前オフセッ

ト値と前セ グメント長

の和

○ ○ − − × × 新グループ

識別子

1 0

指定するオプション 命令に先行するグループと 論理メッセージの状態

キューマネジャが使用する値

MQPMO_

LOG ICAL_

ORDER

MQMF_

MSG_

IN_

GROUP または MQMF_

LAST_

MSG_

IN_

GROUP

MQMF_

SEG MENT または MQMF_

LAST_

SEG MENT

MQMF_

SEG MENT ATION_

ALLO WED

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

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

Group Id

MsgSeq Number

Offset

○ ○ − − ○ × 前グループ

識別子

前シーケン ス番号に 1

を加算

0

○ ○ ○ − ○ ○ 前グループ

識別子

前シーケン ス番号

前オフセッ ト値と前セ グメント長

の和

× × × × − − MQGI_

NONE

1 0

× × × ○ − − • MQGI_

NONE の場合:

新グルー プ識別子

• それ以外 の場合:

フィール ドの値

1 0

× × ○ − − − • MQGI_

NONE の場合:

新グルー プ識別子

• それ以外 の場合:

フィール ドの値

1 フィールド

の値

× ○ × − − − • MQGI_

NONE の場合:

新グルー プ識別子

フィールド の値

0

指定するオプション 命令に先行するグループと 論理メッセージの状態

キューマネジャが使用する値

MQPMO_

LOG ICAL_

ORDER

MQMF_

MSG_

IN_

GROUP または MQMF_

LAST_

MSG_

IN_

GROUP

MQMF_

SEG MENT または MQMF_

LAST_

SEG MENT

MQMF_

SEG MENT ATION_

ALLO WED

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

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

Group Id

MsgSeq Number

Offset

× ○ × − − − • それ以外

の場合:

フィール ドの値

フィールド の値

0

× ○ ○ − − − • MQGI_

NONE の場合:

新グルー プ識別子

• それ以外 の場合:

フィール ドの値

フィールド の値

フィールド の値

(凡例)

○:該当します。

×:該当しません。

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

注意事項

MQPMO_LOGICAL_ORDER は,MQPUT1 命令に対しては無効です。

MsgId フィールドに対して,MQPMO_NEW_MSG_ID または MQMI_NONE が指定された とき,キューマネジャは新しいメッセージ識別子を生成します。その場合は,ほかのフィール ドの値を使用します。

CorrelId フィールドに対して MQPMO_NEW_CORREL_ID が指定されたとき,キューマネ ジャは新しい相関識別子を生成します。その場合は,ほかのフィールドの値を使用します。

MQPMO_LOGICAL_ORDER が指定されたとき,グループ内の全メッセージと論理メッセージの全 セグメントの MQMD 構造体の Persistence フィールドに,同一の値を指定してキューマネジャに登録 しなければなりません。つまり,すべてが永続的であるか,または非永続であるかのどちらかでなけれ

ばなりません。この条件が満たされない場合,MQPUT 命令は理由コード MQRC_INCONSISTENT_PERSISTENCE で失敗します。

MQPMO_LOGICAL_ORDER オプションが同期点に及ぼす影響を次に示します。

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

• グループの最初の論理メッセージ,またはセグメントがトランザクション内で登録されなかった場 合,同じキューハンドルを使うときは,グループ内のほかの論理メッセージとセグメントを同じト ランザクション内で登録することはできません。

上記の条件を満たさなかった場合,MQPUT 命令は MQRC_INCONSISTENT_UOW の理由コード で失敗します。

MQPMO_LOGICAL_ORDER が指定されたとき,MQPUT 命令で指定された MQMD 構造体は MQMD_VERSION_2 より前のバージョンではいけません。この条件が満足されない場合は,

MQRC_WRONG_MD_VERSION の理由コードで失敗します。

MQPUT 命令に MQPMO_LOGICAL_ORDER を指定しない場合,グループのメッセージおよび論理 メッセージのセグメントは,どのような順序で登録してもかまいません。また,完全なメッセージグ ループや完全な論理メッセージを登録する必要もありません。GroupId フィールド,MsgSeqNumber フィールド,Offset フィールド,および MsgFlags フィールドには,アプリケーションによって正し い値が設定されます。

システムに障害が起きた場合,メッセージグループや論理メッセージを途中から再開する方法を示しま す。システム再開時,アプリケーションは GroupId フィールド,MsgSeqNumber フィールド,Offset フィールド,MsgFlags フィールド,および Persistence フィールドに適当な値を設定します。その 後,MQPMO_SYNCPOINT または MQPMO_NO_SYNCPOINT に適当な値を設定します。する と,MQPMO_LOGICAL_ORDER を指定しないで MQPUT 命令を発行できます。この MQPUT 命 令が成功したとき,キューマネジャは,グループとセグメントの情報を保持します。そのキューハンド ルを使用した後続の MQPUT 命令では,通常の MQPMO_LOGICAL_ORDER を指定できます。

キューマネジャが MQPUT 命令用に保持しているグループ情報およびセグメント情報は,MQGET 命 令用に保持しているグループ情報およびセグメント情報とは別です。

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

• MQPMO_LOGICAL_ORDER を指定していない場合,MQPUT 命令が成功するたびに,キュー マネジャはアプリケーションに指定された値を,キューハンドルのグループおよびセグメント情報 に設定します。その情報で,キューハンドルに対してキューマネジャが保持していたグループとセ グメントの情報を置き換えます。

• MQPMO_LOGICAL_ORDER が指定されない場合,現在のメッセージグループまたは論理メッ セージが存在するとき,その命令は失敗しません。命令は MQCC_WARNING 完了コードで成功 します。MQPUT 命令と MQCLOSE 命令が,グループ情報およびセグメント情報で矛盾している 場合の結果を次の表に示します。

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