MQGMO のオプション (MQLONG)

MQGMO オプションは、MQGET のアクションを制御します。 オプションは 0 個以上指定できます。 複数のオプションの値を指定する必要があるときは、次のようにします。
  • 値を加算する (同じ定数は 2 回以上加算しない)
  • ビット単位の OR 演算を使用して値を結合する (プログラミング言語がビット演算をサポートしている場合)
無効なオプションの組み合わせについては注記されています。それ以外の組み合わせは有効です。

待機オプション

以下のオプションは、メッセージがキューに到着するまでの待機に関連するオプションです。
MQGMO_WAIT
アプリケーションは、適切なメッセージが到着するまで待機します。 アプリケーションが待機する最大時間は、 WaitInterval に指定されています。
重要: 適切なメッセージがすぐに使用可能な場合は、待機も遅延もありません。

MQGET 要求が使用禁止になっている場合や、待機中に MQGET 要求が使用禁止になる場合は、待機が取り消されます。 キューに適切なメッセージがあるかどうかに関係なく、呼び出しはMQCC_FAILEDおよび理由コードMQRC_GET_INHIBITEDで完了します。

MQGMO_WAIT は、 MQGMO_BROWSE_FIRST オプションまたは MQGMO_BROWSE_NEXT オプションとともに使用できます。

同じ共有キューでいくつかのアプリケーションが待機している場合は、以下の規則に従い、適切なメッセージが到着したときに活動化されるアプリケーションが選択されます。

表 1. 共用キューで MQGET 呼び出しを活動化するための規則。
活動化されるのを待機している MQGET 呼び出しの数 結果
BROWSE オプションを使用する場合 BROWSE オプションなし 1
なし 1 以上 BROWSE オプションを指定しない 1 つの MQGET 呼び出しが活動化されます。
1 以上 なし BROWSE オプションを指定したすべての MQGET 呼び出しが活動化されます。
1 以上 1 以上 BROWSE オプションを指定しない 1 つの MQGET 呼び出しが活動化されます。 BROWSE オプションを指定した MQGET 呼び出しのうち、活動化される呼び出しの数は予測できません。
BROWSE オプションを指定しない複数の MQGET 呼び出しが同じキューで待機している場合、1 つの呼び出しのみが活動化されます。 キュー・マネージャーは、待機中の呼び出しに対して以下の順序で優先順位を与えます。
  1. 特定のメッセージによってのみ満たすことができる特定の get-wait 要求。例えば、特定のMsgIdまたはCorrelId (あるいはその両方) を持つ要求。
  2. どのメッセージによっても満たすことができる一般的な get-wait 要求。
注:
  • 最初のカテゴリー内では、より具体的な get - wait 要求に優先順位を追加することはできません。 例えば、MsgIdCorrelId の両方を指定する要求などです。
  • いずれのカテゴリーでも、どのアプリケーションが選択されるか予測はできません。 特に、待機時間が長いアプリケーションから選択されるとは限りません。
  • オペレーティング・システムのパス長および優先順位スケジューリングが考慮された結果、待機中のアプリケーションのうち、予期された優先順位より低いオペレーティング・システムの優先順位を持つアプリケーションがメッセージを取得する場合もあります。
  • 待機をしていないアプリケーションのほうが、待機中のアプリケーションより優先されてメッセージを取得することもあります。
[z/OS] z/OS®では、以下の点が適用されます。
  • メッセージの到着を待機している間に、アプリケーションが他の作業を続行するようにしたい場合は、代わりにシグナル・オプション (MQGMO_SET_SIGNAL) を使用することを検討してください。 ただし、シグナル・オプションは環境固有のものなので、異なる環境との間で移植するアプリケーションではこれを使用してはなりません。
  • 複数の MQGET 呼び出しが同じメッセージを待機している場合、待機オプションとシグナル・オプションが混在していても、各待機呼び出しは同等に扱われます。 MQGMO_WAITMQGMO_SET_SIGNALを指定するとエラーになります。 また、未解決のシグナルがあるキュー・ハンドルと共にこのオプションを指定した場合も、エラーになります。
  • MQIT_MSG_TOKENIndexTypeを持つキューに対してMQGMO_WAITまたはMQGMO_SET_SIGNALを指定した場合、選択基準は許可されません。 つまり、以下のようになります。
    • version-1 MQGMOを使用している場合は、 MQGET 呼び出しで指定した MQMDMsgId および CorrelId フィールドを MQMI_NONE および MQCI_NONEに設定します。
    • version-2 以降MQGMOを使用している場合は、MatchOptionsフィールドをMQMO_NONEに設定します。
  • 共有キューに対する MQGET 呼び出しにおいて、この呼び出しがブラウズ要求またはグループ・メッセージの破壊読み取りである場合、MsgId または CorrelId を使用した突き合わせがいずれも行われなければ、200 ミリ秒後にユーザーのシグナル ECB で MQEC_MSG_ARRIVED が通知されます。

    適切なメッセージがキューに到着していない場合でもこれが行われ、やがて待機インターバルが満了すると MQEC_WAIT_INTERVAL_EXPIRED がキューに通知されます。 MQEC_MSG_ARRIVED が通知される場合、2 番目の MQGET 呼び出しを再発行することでメッセージを取得する必要があります (入手可能な場合)。

    この手法を使うと、タイムリーな方法でメッセージ到着が通知されるようになりますが、非共有キューに対する同様の呼び出しシーケンスと比べて、予期されない処理オーバーヘッドと見なすこともできます。

MQGMO_WAITは、MQGMO_BROWSE_MSG_UNDER_CURSORまたはMQGMO_MSG_UNDER_CURSORと一緒に指定しても無視されます。エラーは発生しません。

MQGMO_NO_WAIT
適切なメッセージを入手できない場合、アプリケーションは待機しません。 MQGMO_NO_WAITは、MQGMO_WAITの反対です。 MQGMO_NO_WAITは、プログラム文書化を支援するために定義されています。 いずれも指定されていないときは、これがデフォルト値になります。
MQGMO_SET_SIGNAL
このオプションは、Signal1フィールドおよびSignal2フィールドとともに使用します。 このオプションにより、アプリケーションは、メッセージの到着を待つ間に他の作業の処理を進めることができます。 また、アプリケーションは、複数のキューに到着するメッセージを待つことができます (適切なオペレーティング・システム機能が使用可能な場合)。
注: MQGMO_SET_SIGNAL オプションは環境によって異なります。移植したいアプリケーションには使用しないでください。
次の 2 つの状況においては、このオプションが指定されていない場合と同様の方法で呼び出しが完了します。
  1. 現在使用可能なメッセージが、メッセージ記述子に指定されている基準を満たしている場合。
  2. パラメーター・エラーやその他の同期エラーが検出された場合。

メッセージ記述子に指定されている基準を満たすメッセージがどれも現在使用可能でない場合は、メッセージの到着を待たずに制御がアプリケーションに戻されます。 CompCodeおよびReasonパラメーターは、MQCC_WARNINGおよびMQRC_SIGNAL_REQUEST_ACCEPTEDに設定されます。 その他のメッセージ記述子内の出力フィールド、および MQGET 呼び出しの出力パラメーターは、設定されません。 その後、適切なメッセージが到着すると、ECB を通知することによってシグナルが送達されます。

この後、呼び出し元は MQGET 呼び出しを再発行して、メッセージを取得する必要があります。 アプリケーションは、オペレーティング・システムが提供する関数を使用して、このシグナルを待機することができます。

オペレーティング・システムが複数待機のメカニズムを提供している場合、そのメカニズムを利用して複数のキューのいずれかにメッセージが到着するのを待機できます。

ゼロ以外のWaitIntervalが指定された場合、待機間隔が満了した後にシグナルが送信されます。 キュー・マネージャーは待機をキャンセルすることもでき、その場合、シグナルが送達されます。

複数の MQGET 呼び出しが同じメッセージ用のシグナルを設定する場合があります。 アプリケーションが活動化される順序は、MQGMO_WAITで説明されている順序と同じです。

複数の MQGET 呼び出しが同じメッセージを待機している場合、各待機呼び出しは同等に扱われます。 複数の呼び出しで、待機オプションとシグナル・オプションが混在していても構いません。

特定の条件下では、MQGET 呼び出しがメッセージを取得し、そのメッセージが到着した結果として生成されたシグナルが送達される場合があります。 シグナルが送達される場合、アプリケーションは、使用可能なメッセージがない状態に対する準備ができていなければなりません。

1 つのキュー・ハンドルに、複数の未解決のシグナル要求があってはなりません。

このオプションと組み合わせて使用できないオプションは、以下のとおりです。
  • MQGMO_UNLOCK
  • MQGMO_WAIT

共有キューに対する MQGET 呼び出しにおいて、この呼び出しが browse 要求またはグループ・メッセージの破壊読み取りである場合、MsgId または CorrelId を使用した突き合わせがいずれも行われなければ、200 ミリ秒後にユーザーのシグナル ECB で MQEC_MSG_ARRIVED が通知されます。

これは、適切なメッセージがキューに到着していない場合でも、待機間隔が満了するまで、キューが MQEC_WAIT_INTERVAL_EXPIREDで通知されるまで発生します。 MQEC_MSG_ARRIVED が通知される場合、2 番目の MQGET 呼び出しを再発行することでメッセージを取得する必要があります (入手可能な場合)。

この手法を使うと、タイムリーな方法でメッセージ到着が通知されるようになりますが、非共有キューに対する同様の呼び出しシーケンスと比べて、予期されない処理オーバーヘッドと見なすこともできます。

メッセージの追加頻度が低い場合には、これは効率的なメッセージ取得方法ではありません。 ブラウズの場合のこのオーバーヘッドを回避するには、 MQGET 呼び出しで MsgId (索引が付いていないか、 MsgIdによって索引が付けられている場合) または CorrelId ( CorrelIdによって索引が付けられている場合) を指定します。

[z/OS]このオプションは、 z/OS でのみサポートされます。

MQGMO_FAIL_IF_QUIESCING
キュー・マネージャーが静止状態にある場合、MQGET 呼び出しを強制的に失敗させます。

[z/OS] z/OSでは、このオプションは、接続 ( CICS® または IMS アプリケーションの場合) が静止状態の場合にも、 MQGET 呼び出しを強制的に失敗させます。

このオプションがMQGMO_WAITまたはMQGMO_SET_SIGNALとともに指定され、キュー・マネージャーが静止状態になった時点で待機またはシグナルが未解決である場合は、以下のようになります。
  • 待機は取り消され、呼び出しは完了コードMQCC_FAILEDと理由コードMQRC_Q_MGR_QUIESCINGまたはMQRC_CONNECTION_QUIESCINGを戻します。
  • シグナルが、環境固有のシグナル完了コードと共に取り消されます。

    [z/OS] z/OSでは、シグナルはイベント完了コード MQEC_Q_MGR_QUIESCING または MQEC_CONNECTION_QUIESCINGで完了します。

MQGMO_FAIL_IF_QUIESCINGが指定されず、キュー・マネージャーまたは接続が静止状態に入った場合、待機またはシグナルは取り消されません。

同期点オプション

以下のオプションは、作業単位内での MQGET 呼び出しの参加に関連したオプションです。
MQGMO_SYNCPOINT
この要求は、通常の作業単位プロトコルの中で操作することです。 メッセージには、他のアプリケーションでは使用できないものとしてマークが付けられますが、作業単位がコミットされたときにのみ、キューから削除されます。 作業単位がバックアウトされると、メッセージは再び使用可能になります。
MQGMO_SYNCPOINTおよびMQGMO_NO_SYNCPOINTを設定解除したままにすることができます。 その場合、get 要求の作業単位プロトコルへの組み込みは、キュー・マネージャーの実行環境によって決定されます。 アプリケーションの実行環境によって決定されるのではありません。
  • [z/OS] z/OSでは、get 要求は作業単位内にあります。
  • z/OS以外のすべての環境では、get 要求は作業単位内にありません。

このような違いがあるため、移植するアプリケーションでは、このオプションをデフォルトにすることはできません。MQGMO_SYNCPOINTまたはMQGMO_NO_SYNCPOINTを明示的に指定してください。

このオプションと組み合わせて使用できないオプションは、以下のとおりです。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_LOCK
  • MQGMO_NO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
MQGMO_SYNCPOINT_IF_PERSISTENT
この要求は、取り出されたメッセージが持続する場合に限り、標準の作業単位プロトコル内で機能します。 持続メッセージは、MQMDPersistenceフィールドに値MQPER_PERSISTENTを持ちます。
  • メッセージが持続メッセージの場合、キュー・マネージャーは、アプリケーションがMQGMO_SYNCPOINTを指定したかのように呼び出しを処理します。
  • メッセージが持続メッセージでない場合、キュー・マネージャーは、アプリケーションがMQGMO_NO_SYNCPOINTを指定したかのように呼び出しを処理します。
このオプションと組み合わせて使用できないオプションは、以下のとおりです。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_COMPLETE_MSG
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_NO_SYNCPOINT
  • MQGMO_SYNCPOINT
  • MQGMO_UNLOCK
このオプションは、次の環境でサポートされます。
  • [AIX]AIX®
  • [IBM i]IBM® i
  • [Linux]Linux®
  • [z/OS]z/OS
および、これらのシステムに接続された IBM MQ MQI clients の場合。
MQGMO_NO_SYNCPOINT
この要求は、通常の作業単位プロトコルの外部で動作することになります。 ブラウズ・オプションなしのメッセージを受け取った場合、メッセージは直ちにキューから削除されます。 作業単位をバックアウトすることによって、メッセージを再度使用可能にすることはできません。

このオプションは、MQGMO_BROWSE_FIRSTまたはMQGMO_BROWSE_NEXTを指定した場合に想定されます。

MQGMO_SYNCPOINTおよびMQGMO_NO_SYNCPOINTを設定解除したままにすることができます。 その場合、get 要求の作業単位プロトコルへの組み込みは、キュー・マネージャーの実行環境によって決定されます。 アプリケーションの実行環境によって決定されるのではありません。
  • [z/OS] z/OSでは、get 要求は作業単位内にあります。
  • z/OS以外のすべての環境では、get 要求は作業単位内にありません。

このような違いがあるため、移植するアプリケーションでは、このオプションをデフォルトにすることはできません。MQGMO_SYNCPOINTまたはMQGMO_NO_SYNCPOINTのいずれかを明示的に指定してください。

このオプションと組み合わせて使用できないオプションは、以下のとおりです。
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
[z/OS]MQGMO_MARK_SKIP_BACKOUT
このオプションでマークしたメッセージをキュー上に復元せずに、作業単位をバックアウトします。

このオプションは、 z/OSでのみサポートされます。

このオプションを指定する場合は、MQGMO_SYNCPOINTも指定する必要があります。 MQGMO_MARK_SKIP_BACKOUTは、以下のいずれかのオプションでは無効です。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_LOCK
  • MQGMO_NO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
注: IMS および CICSでは、 MQGMO_MARK_SKIP_BACKOUTでマークされたメッセージを含む作業単位をバックアウトした後に、追加の IBM MQ 呼び出しを発行しなければならない場合があります。 マークされたメッセージを含む新しい作業単位をコミットする前に、 IBM MQ 呼び出しを発行する必要があります。 呼び出しは、任意の IBM MQ 呼び出しにすることができます。
  1. IMSでは、 IMS APAR PN60855 を適用しておらず、 IMS MPP または BMP アプリケーションを実行している場合。
  2. CICS で、任意のアプリケーションを実行している場合。
どちらの場合も、バックアウトされたメッセージを含む新しい作業単位をコミットする前に、 IBM MQ 呼び出しを発行してください。
注: 1 つの作業単位内では、バックアウトをスキップするものとしてマークされた取得要求は 1 つしか存在できず、マークされていない取得要求またはマークされていない取得要求も 1 つしか存在できません。

アプリケーションが作業単位をバックアウトした場合、MQGMO_MARK_SKIP_BACKOUTを使用してリトリーブされたメッセージは、前の状態に復元されません。 その他のリソース更新はバックアウトされます。 メッセージは、バックアウト要求によって開始された新しい作業単位の中で取得されたかのように扱われます。 メッセージは、MQGMO_MARK_SKIP_BACKOUTオプションを指定せずに検索されます。

MQGMO_MARK_SKIP_BACKOUTは、いくつかのリソースが変更された後で、作業単位が正常に完了できないことが明らかになった場合に役立ちます。 このオプションを省略した場合、作業単位をバックアウトするとメッセージがキューに復元されます。 そのメッセージが次に取得された時に、同じ一連のイベントが再度発生します。

しかし、MQGMO_MARK_SKIP_BACKOUT オプションを元の MQGET 呼び出しで指定した場合、作業単位をバックアウトすると、他のリソースに対する更新もバックアウトされます。 メッセージは、新しい作業単位のもとで取得されたかのように扱われます。 アプリケーションは適切なエラー処理を実行することができます。 元のメッセージの送信者にレポート・メッセージを送信したり、送達不能キューに元のメッセージを入れたりすることができます。 その後、アプリケーションは新しい作業単位をコミットすることができます。 新しい作業単位をコミットすると、メッセージは元のキューから永久的に削除されます。

MQGMO_MARK_SKIP_BACKOUTは、単一の物理メッセージにマークを付けます。 メッセージがメッセージ・グループに所属する場合、グループ内の他のメッセージはマークされません。 同様に、マークされたメッセージが論理メッセージのセグメントである場合、論理メッセージ中の他のセグメントはマークされません。

グループ内のどのメッセージにもマークを付けることができますが、MQGMO_LOGICAL_ORDERを使用してメッセージを取得する場合は、グループ内の最初のメッセージにマークを付けると便利です。 作業単位がバックアウトされると、最初の (マークされた) メッセージが新しい作業単位に移動されます。 グループ内の 2 番目以降のメッセージはキューに復元されます。 キューに残っているメッセージは、MQGMO_LOGICAL_ORDERを使用して別のアプリケーションで検索することはできません。 グループ内の最初のメッセージは、既にキューに存在しなくなっています。 ただし、作業単位をバックアウトしたアプリケーションは、MQGMO_LOGICAL_ORDERオプションを使用して、2 番目以降のメッセージを新しい作業単位に取り出すことができます。 最初のメッセージは既に取得されています。

場合によっては、新しい作業単位をバックアウトしなければならないことがあります。 例えば、送達不能キューがいっぱいだが、メッセージを廃棄してはならない場合などです。 新しい作業単位のバックアウトにより、元のキューのメッセージが復元され、メッセージが失われるのを防ぐことができます。 しかし、この状態では処理を続行できません。 新しい作業単位をバックアウトした後、アプリケーションは、オペレーターまたは管理者に、リカバリー不能エラーがあることを通知してから終了する必要があります。

MQGMO_MARK_SKIP_BACKOUTは、get 要求を含む作業単位が、それをバックアウトするアプリケーションによって中断された場合にのみ機能します。 トランザクションまたはシステムに障害が発生したために、取得要求を含む作業単位がバックアウトされた場合、MQGMO_MARK_SKIP_BACKOUTは無視されます。 このオプションを使用して取得されたメッセージはすべて、このオプションなしで取得されたメッセージと同じように、キューで復元されます。

ブラウズ・オプション

以下のオプションは、キュー上のメッセージのブラウズに関連したオプションです。
MQGMO_BROWSE_FIRST
キューが MQOO_BROWSE オプション付きでオープンされる場合、ブラウズ・カーソルが設定され、論理的にキューの最初のメッセージの前に配置されます。 その後 MQGET 呼び出しを使用するときに MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXT、または MQGMO_BROWSE_MSG_UNDER_CURSOR オプションを指定すると、キューからメッセージを非破壊的に取得することができます。 ブラウズ・カーソルは、キュー上のメッセージ内の位置をマークします。 MQGMO_BROWSE_NEXT を指定した次の MQGET 呼び出しは、この位置から適切なメッセージを検索します。
MQGMO_BROWSE_FIRSTは、以下のいずれかのオプションでは無効です。
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_MSG_UNDER_CURSOR
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
キューがブラウズ用にオープンされていなかった場合もエラーになります。

MQGMO_BROWSE_FIRST を指定した MQGET 呼び出しは、ブラウズ・カーソルの直前の位置を無視します。 メッセージ記述子に指定された条件を満たすキュー上の最初のメッセージが検索されます。 メッセージはキューに残り、ブラウズ・カーソルはこのメッセージの上に置かれます。

この呼び出しの後、ブラウズ・カーソルは、戻されたメッセージ上に置かれます。 このメッセージは、 MQGMO_BROWSE_NEXT を指定した次の MQGET 呼び出しが発行される前に、キューから除去される可能性があります。 その場合は、そのキューの中で削除されたメッセージが入っていた位置に (現在そこが空であっても) ブラウズ・カーソルが残ります。

この MQGMO_MSG_UNDER_CURSOR オプションを非ブラウズの MQGET 呼び出しで使用すると、キューからメッセージを削除することになります。

ブラウズ・カーソルは、同じ Hobj ハンドルを使用する場合でも、非ブラウズ MQGET 呼び出しによって移動されません。 また、ブラウズの MQGET 呼び出しで完了コード MQCC_FAILED または理由コード MQRC_TRUNCATED_MSG_FAILED が戻された場合も移動されません。

ブラウズされるメッセージをロックするには、このオプションとともにMQGMO_LOCKオプションを指定します。

MQGMO_BROWSE_FIRSTは、MQGMO_*オプションとMQMO_*オプションの任意の有効な組み合わせで指定できます。これらのオプションは、グループ内のメッセージおよび論理メッセージのセグメントの処理を制御します。

MQGMO_LOGICAL_ORDERを指定すると、メッセージは論理順序でブラウズされます。 このオプションを省略すると、メッセージは物理順序でブラウズされます。 MQGMO_BROWSE_FIRSTを指定すると、論理順序と物理順序を切り替えることができます。 後続の MQGET 呼び出しで MQGMO_BROWSE_NEXT を使用すると、キュー・ハンドル用に MQGMO_BROWSE_FIRST を指定した最後の呼び出しと同じ順序でキューをブラウズします。

キュー・マネージャーは、MQGET 呼び出し用にグループおよびセグメント情報を 2 セット保持します。 ブラウズ呼び出し用のグループおよびセグメント情報は、キューからメッセージを削除する呼び出しの情報とは別個に保持されています。 MQGMO_BROWSE_FIRSTを指定すると、キュー・マネージャーはブラウズ用のグループおよびセグメント情報を無視します。 キュー・マネージャーは、現行のグループも現行の論理メッセージも存在していない場合と同じようにキューをスキャンします。 MQGET 呼び出しが成功すると、完了コード MQCC_OK または MQCC_WARNING が戻され、ブラウズ用のグループおよびセグメント情報は、戻されたメッセージの情報に設定されます。 呼び出しが失敗した場合、ブラウズ用のグループおよびセグメント情報は、呼び出しが行われる前の状態から変更されません。

MQGMO_BROWSE_NEXT
MQGET 呼び出しで指定された選択基準を満たす、キュー上の次のメッセージにブラウズ・カーソルを進めます。 メッセージはアプリケーションに戻されますが、キューに残ります。
MQGMO_BROWSE_NEXTは、以下のいずれかのオプションでは無効です。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_MSG_UNDER_CURSOR
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
キューがブラウズ用にオープンされていなかった場合もエラーになります。

MQGMO_BROWSE_NEXTは、キューがブラウズ用にオープンされた後に、それがキューをブラウズするための最初の呼び出しである場合、MQGMO_BROWSE_FIRSTと同じように動作します。

MQGMO_BROWSE_NEXT を指定した次の MQGET 呼び出しが発行される前に、カーソルの下のメッセージがキューから除去される可能性があります。 そのキューの中で削除されたメッセージが入っていた位置に (現在そこが空であっても) ブラウズ・カーソルが論理的には残ります。

メッセージは、以下の 2 つの方法のいずれかによってキューに入れられます。
  • 優先順位内の FIFO (MQMDS_PRIORITY)、または
  • 優先順位に関係ない FIFO (MQMDS_FIFO)
MsgDeliverySequence キュー属性は、どの方法が適用されるかを示します (詳しくは、 キューの属性 を参照してください)。

キューのMsgDeliverySequenceMQMDS_PRIORITYである可能性があります。 メッセージは、ブラウズ・カーソルが現在示しているキューより高い優先順位のキューに到着します。 この場合、MQGMO_BROWSE_NEXTを使用するキューの現在のスイープ中に、より高い優先順位のメッセージは検出されません。 これは、ブラウズ・カーソルがMQGMO_BROWSE_FIRSTでリセットされた後、またはキューを再オープンすることによってのみ検出できます。

必要に応じて、この MQGMO_MSG_UNDER_CURSOR オプションを非ブラウズの MQGET 呼び出しで使用し、キューからメッセージを削除することができます。

ブラウズ・カーソルは、同じ Hobj ハンドルを使用する非ブラウズ MQGET 呼び出しによって移動されません。

ブラウズされるメッセージをロックするには、このオプションとともにMQGMO_LOCKオプションを指定します。

MQGMO_BROWSE_NEXTは、MQGMO_*オプションとMQMO_*オプションの任意の有効な組み合わせで指定できます。これらのオプションは、グループ内のメッセージおよび論理メッセージのセグメントの処理を制御します。

MQGMO_LOGICAL_ORDERを指定すると、メッセージは論理順序でブラウズされます。 このオプションを省略すると、メッセージは物理順序でブラウズされます。 MQGMO_BROWSE_FIRSTを指定すると、論理順序と物理順序を切り替えることができます。 後続の MQGET 呼び出しで MQGMO_BROWSE_NEXT を使用すると、キュー・ハンドル用に MQGMO_BROWSE_FIRST を指定した最後の呼び出しと同じ順序でキューをブラウズします。 この条件が満たされない場合、呼び出しは失敗し、理由コードMQRC_INCONSISTENT_BROWSEが戻ります。

注: MQGMO_LOGICAL_ORDER が指定されていない場合に、 MQGET 呼び出しを使用してメッセージ・グループの終わりを超えてブラウズするときは、特に注意してください。 例えば、キュー上のグループ内の最後のメッセージが、グループ内の最初のメッセージより前に来ているとします。 MQGMO_BROWSE_NEXT を使用してそのグループの最後より先をブラウズし、その際 MsgSeqNumber1 に設定して MQMO_MATCH_MSG_SEQ_NUMBER を指定すると、既にブラウズ済みのグループの最初のメッセージが戻されることになります。 これは、即時に発生する可能性があります。あるいは、 介入グループがある場合、何度かの MQGET 呼び出し後に発生するかもしれません。 同じ考慮事項が、グループ内にない論理メッセージにも適用されます。

ブラウズ呼び出し用のグループおよびセグメント情報は、キューからメッセージを削除する呼び出しの情報とは別個に保持されています。

MQGMO_BROWSE_MSG_UNDER_CURSOR
MQGMOMatchOptionsフィールドに指定されたMQMO_*オプションに関係なく、ブラウズ・カーソルによって指示されたメッセージを非破壊的に取り出します。
MQGMO_BROWSE_MSG_UNDER_CURSORは、以下のいずれかのオプションでは無効です。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_NEXT
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_MSG_UNDER_CURSOR
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
キューがブラウズ用にオープンされていなかった場合もエラーになります。

ブラウズ・カーソルによって示されるメッセージは、MQGMO_BROWSE_FIRSTオプションまたはMQGMO_BROWSE_NEXTオプションのいずれかを使用して最後に取得されたメッセージです。 このキューがオープンされて以降、これらの呼び出しのいずれも発行されていない場合、呼び出しは失敗します。 また、ブラウズ・カーソルの下にあったメッセージが破壊的に取得されている場合も、呼び出しは失敗します。

ブラウズ・カーソルの位置は、この呼び出しでは変更されません。

この MQGMO_MSG_UNDER_CURSOR オプションを非ブラウズの MQGET 呼び出しで使用し、キューからメッセージを削除することができます。

ブラウズ・カーソルは、同じ Hobj ハンドルを使用する場合でも、非ブラウズ MQGET 呼び出しによって移動されません。 また、ブラウズの MQGET 呼び出しで完了コード MQCC_FAILED または理由コード MQRC_TRUNCATED_MSG_FAILED が戻された場合も移動されません。

MQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_LOCKとともに指定されている場合:
  • 既にロックされているメッセージがある場合、そのメッセージがカーソルの下になければなりません。ロック解除や再度ロックをしないで戻されるようにするためです。 メッセージは、ロックされたままになります。
  • ロックされたメッセージがなく、かつブラウズ・カーソルの下にメッセージがある場合、そのメッセージはロックされ、アプリケーションに戻されます。 ブラウズ・カーソルの下にメッセージがない場合、呼び出しは失敗します。
MQGMO_LOCKを指定せずにMQGMO_BROWSE_MSG_UNDER_CURSORを指定した場合:
  • 既にロックされているメッセージがある場合、そのメッセージがカーソルの下になければなりません。 メッセージはアプリケーションに戻され、その後ロック解除されます。 メッセージはロック解除されているので、メッセージをもう一度ブラウズできない場合や、同じアプリケーションから破壊的に取得できない場合があります。 キューからメッセージを取得する別のアプリケーションによって、破壊的に取得されている場合があるからです。
  • ロックされたメッセージがなく、ブラウズ・カーソルの下にメッセージがある場合、そのメッセージがアプリケーションに戻されます。 ブラウズ・カーソルの下にメッセージがない場合、呼び出しは失敗します。

MQGMO_COMPLETE_MSGMQGMO_BROWSE_MSG_UNDER_CURSORとともに指定されている場合、ブラウズ・カーソルは、MQMD 内のOffsetフィールドがゼロであるメッセージを識別する必要があります。 この条件が満たされない場合、呼び出しは失敗し、理由コードMQRC_INVALID_MSG_UNDER_CURSORが戻ります。

ブラウズ呼び出し用のグループおよびセグメント情報は、キューからメッセージを削除する呼び出しの情報とは別個に保持されています。

MQGMO_MSG_UNDER_CURSOR
MQGMOMatchOptionsフィールドに指定されているMQMO_*オプションに関係なく、ブラウズ・カーソルが指すメッセージを検索します。 メッセージはキューから削除されます。

ブラウズ・カーソルによって示されるメッセージは、MQGMO_BROWSE_FIRSTオプションまたはMQGMO_BROWSE_NEXTオプションのいずれかを使用して最後に取得されたメッセージです。

MQGMO_COMPLETE_MSGMQGMO_MSG_UNDER_CURSORとともに指定されている場合、ブラウズ・カーソルは、MQMD 内のOffsetフィールドがゼロであるメッセージを識別する必要があります。 この条件が満たされない場合、呼び出しは失敗し、理由コードMQRC_INVALID_MSG_UNDER_CURSORが戻ります。

このオプションと組み合わせて使用できないオプションは、以下のとおりです。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
  • MQGMO_UNLOCK
キューがブラウズ用および入力用にオープンされていなかった場合もエラーになります。 ブラウズ・カーソルが取得可能なメッセージを現在指し示していない場合は、MQGET 呼び出しでエラーが戻されます。
MQGMO_MARK_BROWSE_HANDLE
正常な MQGET によって戻されたメッセージ、または戻された MsgToken によって識別されるメッセージにマークが付けられます。 マークは、呼び出しで使用されるオブジェクト・ハンドルに固有のものです。

メッセージはキューから削除されません。

MQGMO_MARK_BROWSE_HANDLEは、以下のいずれかのオプションも指定されている場合にのみ有効です。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
MQGMO_MARK_BROWSE_HANDLEは、以下のいずれかのオプションでは無効です。
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_UNLOCK
メッセージは、次のいずれかのイベントが発生するまでこの状態のままとなります。
  • 関係するオブジェクト・ハンドルが、通常クローズまたは異常クローズされる。
  • オプション MQGMO_UNMARK_BROWSE_HANDLEを指定した MQGET の呼び出しによって、このハンドルのメッセージのマークが解除されます。
  • メッセージは、破壊的な MQGETの呼び出しから戻されます。破壊的なは、 MQCC_OK または MQCC_WARNINGで完了します。 MQGET が後でロールバックされた場合も、メッセージの状態は変更されたままです。
  • メッセージの有効期限が切れる。
MQGMO_MARK_BROWSE_CO_OP
正常な MQGET によって戻されたメッセージ、または戻された MsgToken によって識別されるメッセージは、協働セット内のすべてのハンドルについてマーク付けされます。

協働レベル・マークは、既に設定されている可能性のある任意のハンドル・レベル・マークに追加して付けられます。

メッセージはキューから削除されません。

MQGMO_MARK_BROWSE_CO_OP は、使用されたオブジェクト・ハンドルが、 MQOO_CO_OPを指定した MQOPEN への呼び出しによって戻された場合にのみ有効です。 以下の MQGMO オプションのいずれか 1 つも指定する必要があります。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
  • MQGMO_BROWSE_NEXT
このオプションと組み合わせて使用できないオプションは、以下のとおりです。
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_UNLOCK

メッセージが既にマークされており、オプションMQGMO_UNMARKED_BROWSE_MSGが指定されていない場合、呼び出しはMQCC_FAILEDおよび理由コードMQRC_MSG_MARKED_BROWSE_CO_OPで失敗します。

メッセージは、次のいずれかのイベントが発生するまでこの状態のままとなります。
  • 協働セットのオブジェクト・ハンドルすべてがクローズされる。
  • オプション MQGMO_UNMARK_BROWSE_CO_OPを指定して MQGET を呼び出すと、連携ブラウザーのメッセージのマークが解除されます。
  • キュー・マネージャーによってメッセージが自動的にマーク解除される。
  • メッセージが非ブラウズ MQGET の呼び出しから戻される。 MQGET が後でロールバックされた場合も、メッセージの状態は変更されたままです。
  • メッセージの有効期限が切れる。
MQGMO_UNMARKED_BROWSE_MSG
MQGMO_UNMARKED_BROWSE_MSG を指定して MQGET を呼び出すと、ハンドルのマークが解除されたと見なされるメッセージが返されます。 ハンドルに対してマークが付けられたメッセージは戻しません。 また、キューがオプション MQOO_CO_OPを指定した MQOPENの呼び出しによってオープンされ、メッセージが連携セットのメンバーによってマークされている場合も、メッセージを戻しません。
このオプションと組み合わせて使用できないオプションは、以下のとおりです。
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_UNLOCK
MQGMO_UNMARK_BROWSE_CO_OP
このオプションを指定した MQGET 呼び出しの後では、メッセージは協働ハンドルのセット内のどのオープン・ハンドルからも、協働セット用にマーク付けされているとはみなされなくなります。 その呼び出しの前にメッセージがハンドル・レベルでマーク付けされた場合は、引き続きハンドル・レベルでマーク付けされているとみなされます。

MQGMO_UNMARK_BROWSE_CO_OP の使用は、オプション MQOO_CO_OPを指定した MQOPEN の正常な呼び出しによって戻されるハンドルでのみ有効です。 MQGET は、協働ハンドル・セットからメッセージがマーク付けされているとみなされていなくても成功します。

MQGMO_UNMARK_BROWSE_CO_OP は非ブラウズ MQGET 呼び出しでは無効であり、以下のオプションと組み合わせて使用することもできません。
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_MARK_BROWSE_CO_OP
  • MQGMO_UNLOCK
  • MQGMO_UNMARKED_BROWSE_MSG
MQGMO_UNMARK_BROWSE_HANDLE
このオプションを指定して MQGET を呼び出すと、置かれているメッセージは、このハンドルからは、マーク付けされているメッセージとみなされなくなります。

呼び出しは、このハンドルに対してメッセージがマークされていなくても成功します。

このオプションは、非ブラウズ MQGET 呼び出しでは無効であり、以下のオプションと組み合わせて使用することもできません。
  • MQGMO_ALL_MSGS_AVAILABLE
  • MQGMO_ALL_SEGMENTS_AVAILABLE
  • MQGMO_COMPLETE_MSG
  • MQGMO_LOCK
  • MQGMO_LOGICAL_ORDER
  • MQGMO_MARK_BROWSE_CO_OP
  • MQGMO_UNLOCK
  • MQGMO_UNMARKED_BROWSE_MSG

ロック・オプション

以下のオプションは、キュー上のメッセージのロックに関連したオプションです。
MQGMO_LOCK
ブラウズされるメッセージをロックします。ロックされたメッセージは、このキューに対してオープンされた他のハンドルからは見えなくなります。 このオプションを指定できるのは、以下のオプションのいずれか 1 つが指定されている場合に限ります。
  • MQGMO_BROWSE_FIRST
  • MQGMO_BROWSE_NEXT
  • MQGMO_BROWSE_MSG_UNDER_CURSOR
各キュー・ハンドルに対して 1 つのメッセージだけをロックできます。 メッセージは、論理メッセージでも物理メッセージでも構いません。
  • MQGMO_COMPLETE_MSGを指定すると、論理メッセージを構成するすべてのメッセージ・セグメントがキュー・ハンドルにロックされます。 メッセージはすべてそのキュー上にあり、取得可能になっている必要があります。
  • MQGMO_COMPLETE_MSGを省略すると、1 つの物理メッセージのみがキュー・ハンドルに対してロックされます。 このメッセージがたまたま論理メッセージのセグメントである場合、ロックされたセグメントは、他のアプリケーションがMQGMO_COMPLETE_MSGを使用して論理メッセージを検索またはブラウズするのを防ぎます。

ロックされたメッセージは常にブラウズ・カーソルの下にあります。 MQGMO_MSG_UNDER_CURSOR オプションを指定した後の MQGET 呼び出しによって、メッセージをキューから除去することができます。 キュー・ハンドルを使用する他の MQGET 呼び出し (例えば、ロックされたメッセージのメッセージ ID を指定した呼び出し) でも、メッセージを削除できます。

呼び出しが完了コードMQCC_FAILEDまたはMQCC_WARNINGと理由コードMQRC_TRUNCATED_MSG_FAILEDを戻した場合、メッセージはロックされません。

アプリケーションがキューからメッセージを削除しない場合、ロックは以下のアクションのいずれかによって解除されます。
  • MQGMO_BROWSE_FIRST または MQGMO_BROWSE_NEXTのいずれかを指定して、このハンドルに対して別の MQGET 呼び出しを発行します。 呼び出しがMQCC_OKまたはMQCC_WARNINGで完了すると、ロックは解除されます。 呼び出しがMQCC_FAILEDで完了すると、メッセージはロックされたままになります。 ただし、次の場合は例外になります。
    • MQCC_WARNINGMQRC_TRUNCATED_MSG_FAILEDで返された場合、メッセージはアンロックされません。
    • MQCC_FAILEDMQRC_NO_MSG_AVAILABLEとともに返された場合、メッセージはアンロックされます。

    MQGMO_LOCKも指定した場合、返されるメッセージはロックされます。 MQGMO_LOCKを省略すると、呼び出し後にロックされたメッセージは表示されません。

    MQGMO_WAITを指定し、すぐに使用可能なメッセージがない場合は、待機の開始前に元のメッセージがアンロックされます。

  • MQGMO_BROWSE_MSG_UNDER_CURSORを指定し、 MQGMO_LOCKを指定せずに、このハンドルに対して別の MQGET 呼び出しを発行する。 呼び出しがMQCC_OKまたはMQCC_WARNINGで完了すると、ロックは解除されます。 呼び出しがMQCC_FAILEDで完了すると、メッセージはロックされたままになります。 ただし、次のような例外があります。
    • MQCC_WARNINGMQRC_TRUNCATED_MSG_FAILEDで返された場合、メッセージはアンロックされません。
  • MQGMO_UNLOCKを指定して、このハンドルに対して別の MQGET 呼び出しを発行する。
  • このハンドルに対して MQCLOSE 呼び出しを発行する。 アプリケーションの終了によって MQCLOSE が暗黙的に行われる可能性があります。
MQGMO_LOCKを指定するために、 MQOO_BROWSE以外の特別な MQOPEN オプションは必要ありません。このオプションは、付随するブラウズ・オプションを指定するために必要です。
MQGMO_LOCKは、以下のいずれかのオプションでは無効です。
  • MQGMO_MARK_SKIP_BACKOUT
  • MQGMO_SYNCPOINT
  • MQGMO_SYNCPOINT_IF_PERSISTENT
  • MQGMO_UNLOCK
MQGMO_UNLOCK
アンロックするメッセージは、 MQGMO_LOCK オプションを指定した MQGET 呼び出しによって事前にロックされていなければなりません。 このハンドルに対してロックされたメッセージがない場合、呼び出しはMQCC_WARNINGおよびMQRC_NO_MSG_LOCKEDで完了します。

MQGMO_UNLOCKを指定した場合、MsgDescBufferLengthBuffer、およびDataLengthパラメーターは検査も変更もされません。 Bufferにメッセージは返されません。

MQGMO_UNLOCKを指定するために特別なオープン・オプションは必要ありません (ただし、最初にロック要求を発行するにはMQOO_BROWSEが必要です)。

このオプションは、以下のオプション以外のオプションとは組み合わせて使用できません。
  • MQGMO_NO_WAIT
  • MQGMO_NO_SYNCPOINT
これらのオプションは、指定されているかどうかに関わらず、どちらも想定されています。

メッセージ・データ・オプション

以下のオプションは、メッセージがキューから読み取られるときのメッセージ・データの処理に関連しています。
MQGMO_ACCEPT_TRUNCATED_MSG
メッセージ・バッファーが小さく、メッセージ全体を収容できない場合に、MQGET 呼び出しによってバッファーを満たすことができるようにします。 MQGET はバッファーに収容できるだけメッセージを入れます。 警告完了コードを出して、その処理を終了します。 つまり、以下のようになります。
  • メッセージをブラウズすると、ブラウズ・カーソルが、戻されたメッセージに進みます。
  • メッセージを削除すると、戻されたメッセージがキューから削除されます。
  • 他にエラーが発生していなければ、理由コード MQRC_TRUNCATED_MSG_ACCEPTED が戻ります。
このオプションを指定しないと、バッファーは、収容できる分だけのメッセージで満たされたままになります。 警告完了コードが出されますが、処理は完了しません。 つまり、以下のようになります。
  • メッセージをブラウズしても、ブラウズ・カーソルは進みません。
  • メッセージを削除しても、メッセージはキューから削除されません。
  • 他のエラーが発生しない場合は、理由コードMQRC_TRUNCATED_MSG_FAILEDが返されます。
MQGMO_CONVERT
このオプションは、 MQGET 呼び出しの MsgDesc パラメーターで指定された CodedCharSetId および Encoding 値に準拠するように、メッセージ内のアプリケーション・データを変換します。 データは、Bufferパラメーターにコピーされる前に変換されます。
メッセージが書き込まれたときに指定されたFormatフィールドは、メッセージ内のデータの性質を識別するために変換プロセスによって想定されます。 メッセージ・データの変換は、組み込み形式の場合はキュー・マネージャーによって行われ、他の形式の場合はユーザー作成出口によって行われます。 データ変換出口の詳細については、 データ変換出口 を参照してください。
  • 変換が正常に行われた場合、 MsgDesc パラメーターに指定された CodedCharSetId および Encoding フィールドは、 MQGET 呼び出しからの戻り時に変更されません。
  • 変換が失敗した場合のみ、メッセージ・データは変換されずに戻されます。MsgDescCodedCharSetIdおよびEncodingフィールドは、変換されていないメッセージの値に設定されます。 この場合、完了コードはMQCC_WARNINGです。
いずれの場合も、これらのフィールドは、Bufferパラメーターで返されるメッセージ・データの文字セット ID とエンコードを記述します。

キュー・マネージャーが変換を実行する形式名のリストについては、 MQMD-メッセージ記述子 で説明されている Format フィールドを参照してください。

グループおよびセグメント・オプション

以下のオプションは、論理メッセージのグループおよびセグメント内のメッセージの処理に関連しています。 オプションについて説明する前に、重要な用語についていくつか定義しておきます。
物理メッセージ
物理メッセージは、キューに入れたりキューから削除したりできる最小の情報単位です。 多くの場合、1 つの MQPUTMQPUT1、または MQGET 呼び出しで指定または取得された情報に相当します。 すべての物理メッセージには、固有のメッセージ記述子、MQMD があります。 通常、物理メッセージは、メッセージ ID (MQMDMsgIdフィールド) の値が異なることによって区別されます。 ただし、キュー・マネージャーは固有の値を強制しません。
論理メッセージ
論理メッセージは、アプリケーション情報の単一ユニットです。 システムに制約がない場合には、1 つの論理メッセージが 1 つの物理メッセージになります。 論理メッセージが大きい場合、システムの制約により、1 つの論理メッセージをセグメントと呼ばれる複数の物理メッセージに分割することが必要になる場合があります。

セグメント化された論理メッセージは、同じ非ヌル・グループ ID (MQMDGroupIdフィールド) を持つ複数の物理メッセージで構成されます。 これらは同じメッセージ・シーケンス番号 (MQMDMsgSeqNumberフィールド) を持っています。 セグメントは、セグメント・オフセット (MQMDOffsetフィールド) の値が異なることによって区別されます。 セグメント・オフセットは、論理メッセージ内のデータの先頭から始まる、物理メッセージ内のデータのオフセットです。 各セグメントは 1 つの物理メッセージなので、論理メッセージ内のセグメントには通常、それぞれ固有のメッセージ ID があります。

セグメント化されていない論理メッセージにも、送信側のアプリケーションでセグメント化が許可されている場合は、ヌル以外のグループ ID があります。 この場合、論理メッセージがメッセージ・グループに属していなければ、そのグループ ID を持つ物理メッセージは 1 つだけになります。 送信側アプリケーションによってセグメント化が禁止されている論理メッセージは、論理メッセージがメッセージ・グループに属していない限り、ヌルのグループ ID MQGI_NONEを持ちます。

メッセージ・グループ
メッセージ・グループは、同じヌル以外のグループ ID を持つ 1 つ以上の論理メッセージのセットです。 グループ内のそれぞれの論理メッセージは、メッセージ順序番号に指定された固有の値で区別されます。 順序番号は 1 から n までの整数で、n はグループ内の論理メッセージの数です。 1 つ以上の論理メッセージをセグメント化すると、グループ内の物理メッセージの数は n 個を超えます。
MQGMO_LOGICAL_ORDER
MQGMO_LOGICAL_ORDER は、キュー・ハンドルに対する連続した MQGET 呼び出しでメッセージが戻される順序を制御します。 このオプションは、それぞれの呼び出しごとに指定する必要があります。

同じキュー・ハンドルに対する連続した MQGET 呼び出しに対して MQGMO_LOGICAL_ORDER を指定すると、グループ内のメッセージは、メッセージ・シーケンス番号の順序で戻されます。 論理メッセージのセグメントはそのセグメント・オフセットで指定された順序で戻されます。 この順序は、これらのメッセージやセグメントのキューでの出現順序とは異なる場合があります。

注: MQGMO_LOGICAL_ORDER を指定しても、グループに属さず、セグメントでもないメッセージに悪影響はありません。 そのようなメッセージは、事実上、1 つのメッセージのみで構成されるメッセージ・グループに属するものとして扱われます。 グループに属するメッセージ、メッセージ・セグメント、およびグループに属さず、セグメント化もされていないメッセージが混在しているキューからメッセージを取得するときに、MQGMO_LOGICAL_ORDER を指定しても問題ありません。

必要な順序でメッセージを戻すように、キュー・マネージャーは、連続した MQGET 呼び出し間でグループおよびセグメント情報を保持します。 グループおよびセグメント情報により、キュー・ハンドルに対する現行のメッセージ・グループと現行の論理メッセージが特定されます。 また、グループおよび論理メッセージ内の現行の位置、およびメッセージが 1 つの作業単位内で取得されているかどうかも特定します。 キュー・マネージャーがこの情報を保持するので、アプリケーションでは、それぞれの MQGET 呼び出しの前にグループおよびセグメント情報を設定する必要はありません。 具体的には、アプリケーションが MQMDGroupIdMsgSeqNumber、およびOffsetの各フィールドを設定する必要がないことを意味します。 ただし、アプリケーションは、各呼び出しでMQGMO_SYNCPOINTオプションまたはMQGMO_NO_SYNCPOINTオプションを正しく設定する必要があります。

キューがオープンしているときは、現行のメッセージ・グループも現行の論理メッセージも存在しません。 1 つのメッセージ・グループが現行のメッセージ・グループとなるのは、MQMF_MSG_IN_GROUP フラグ付きのメッセージが MQGET 呼び出しで戻されたときです。 連続した呼び出しでMQGMO_LOGICAL_ORDERを指定すると、以下のようなメッセージが戻されるまで、そのグループは現行グループのままになります。
  • MQMF_SEGMENTが指定されていないMQMF_LAST_MSG_IN_GROUP (つまり、グループ内の最後の論理メッセージがセグメント化されていません)。
  • MQMF_LAST_SEGMENTを指定したMQMF_LAST_MSG_IN_GROUP (つまり、戻されるメッセージは、グループ内の最後の論理メッセージの最後のセグメントです)。
このようなメッセージが戻されると、メッセージ・グループが終了し、MQGET 呼び出しが正常に完了すると現行のグループはなくなります。 同様に、論理メッセージが現行の論理メッセージとなるのは、MQMF_SEGMENT フラグ付きのメッセージが MQGET 呼び出しで戻されたときです。 MQMF_LAST_SEGMENTフラグを持つメッセージが返されると、論理メッセージは終了します。
選択基準が指定されていない場合、後続の MQGET 呼び出しは、キュー上の最初のメッセージ・グループのメッセージを正しい順序で戻します。 次に 2 番目のメッセージ・グループのメッセージが戻されます。これは、使用できるメッセージがなくなるまで続きます。 MatchOptionsフィールドに以下のオプションを 1 つ以上指定することによって、戻される特定のメッセージ・グループを選択することができます。
  • MQMO_MATCH_MSG_ID
  • MQMO_MATCH_CORREL_ID
  • MQMO_MATCH_GROUP_ID
ただし、これらのオプションが有効なのは、現行のメッセージ・グループも現行の論理メッセージも存在しない場合だけです。 詳細については、 MQGMO-メッセージ取得オプション で説明されている MatchOptions フィールドを参照してください。
表 2 は、 MQGET 呼び出しで戻すメッセージを検出しようとするときにキュー・マネージャーが検索する MsgIdCorrelIdGroupIdMsgSeqNumber、および Offset の各フィールドの値を示しています。 規則は、キューからメッセージを削除する場合にもキューに入っているメッセージをブラウズする場合にも適用されます。 この表の「どちらも」は「はい」または「いいえ」を意味します。
LOG ORD
呼び出しでMQGMO_LOGICAL_ORDERオプションが指定されているかどうかを示します。
Cur grp
現行のメッセージ・グループが呼び出しの前に存在するかどうかを示します。
Cur log msg
現行の論理メッセージが呼び出しの前に存在するかどうかを示します。
その他の列
キュー・マネージャーが検索する値を示します。 「前の」という表現は、キュー・ハンドルに対して前のメッセージのフィールドに戻された値を示します。
表 2. 論理メッセージのグループおよびセグメントに関連した MQGET オプション
指定するオプション 呼び出しの前のグループおよび論理メッセージの状況 キュー・マネージャーが検索する値
LOG ORD Cur grp Cur log msg MsgId CorrelId GroupId MsgSeqNumber Offset
はい いいえ いいえ 統制活動担当者MatchOptions 統制活動担当者MatchOptions 統制活動担当者MatchOptions 1 0
はい いいえ はい 任意のメッセージ ID 任意の相関 ID 前のグループ ID 1 前のオフセット + 前のセグメント長
はい はい いいえ 任意のメッセージ ID 任意の相関 ID 前のグループ ID 前の順序番号 + 1 0
はい はい はい 任意のメッセージ ID 任意の相関 ID 前のグループ ID 前の順序番号 前のオフセット + 前のセグメント長
いいえ どちらも どちらも 統制活動担当者MatchOptions 統制活動担当者MatchOptions 統制活動担当者MatchOptions 統制活動担当者MatchOptions 統制活動担当者MatchOptions

キュー上に複数のメッセージ・グループが存在し、戻してよいものである場合、それらのグループが戻される順序は、各グループ内の最初の論理メッセージの最初のセグメントがキュー上のどの位置にあるかによって決定されます。 つまり、メッセージ順序番号が 1、オフセットが 0 の物理メッセージにより、該当するグループが戻される順序が決定されます。

MQGMO_LOGICAL_ORDERオプションは、以下のように作業単位に影響します。
  • 1 つのグループ内の最初の論理メッセージまたはセグメントが 1 つの作業単位内で取得された場合には、同じキュー・ハンドルが使用されていれば、そのグループ内の他の論理メッセージおよびセグメントはすべて 1 つの作業単位内で取得する必要があります。 ただし、これらは同じ作業単位内で取得する必要はありません。 これにより、多くの物理メッセージからなるメッセージ・グループを、キュー・ハンドルに対する 2 つ以上の連続した作業単位にまたがって分割できます。
  • 1 つのグループ内の最初の論理メッセージまたはセグメントが 1 つの作業単位内で取得されていない場合には、同じキュー・ハンドルが使用されていれば、そのグループ内のその他の論理メッセージおよびセグメントはどれも 1 つの作業単位内で取得することはできません。
これらの条件が満たされないと、MQGET 呼び出しは失敗し、理由コード MQRC_INCONSISTENT_UOW が戻ります。

MQGMO_LOGICAL_ORDER を指定する場合、 MQGET 呼び出しで提供される MQGMOMQGMO_VERSION_2以上でなければならず、 MQMDMQMD_VERSION_2以上でなければなりません。 この条件が満たされない場合、呼び出しは失敗し、該当する理由コードMQRC_WRONG_GMO_VERSIONまたはMQRC_WRONG_MD_VERSIONが戻ります。

キュー・ハンドルに対する連続した MQGET 呼び出しに対して MQGMO_LOGICAL_ORDER が指定されていない場合は、メッセージがメッセージ・グループに属しているかどうか、またはメッセージが論理メッセージのセグメントであるかどうかに関係なく、メッセージが返されます。 これにより、あるグループ内のメッセージや論理メッセージのセグメントが正しくない順序で戻されたり、他のグループ内のメッセージ、他の論理メッセージのセグメント、またはグループにも属さずセグメントでもないメッセージとが混在したりする場合があります。 この場合、連続する MQGET 呼び出しによって戻される特定のメッセージは、それらの呼び出しで指定される MQMO_* オプションによって制御されます (これらのオプションの詳細については、 MQGMO-メッセージ取得オプション で説明されている MatchOptions フィールドを参照してください)。

この手法を用いると、システム障害が発生した後に、メッセージ・グループまたは論理メッセージを途中から再開することができます。 システムの再始動時に、アプリケーションは GroupIdMsgSeqNumberOffset、および MatchOptions フィールドを適切な値に設定し、 MQGMO_LOGICAL_ORDERを指定せずに MQGMO_SYNCPOINT または MQGMO_NO_SYNCPOINT を設定して MQGET 呼び出しを発行することができます。 この呼び出しが成功した場合、キュー・マネージャーはグループおよびセグメント情報を保持し、キュー・ハンドルを使用する後続の MQGET 呼び出しで通常どおり MQGMO_LOGICAL_ORDER を指定できます。

MQGET 呼び出しのためにキュー・マネージャーが保持しているグループおよびセグメント情報は、MQPUT 呼び出しのためにキュー・マネージャーが保持しているグループおよびセグメント情報とは異なります。 また、キュー・マネージャーは、以下についての情報もそれぞれ保持しています。
  • キューからメッセージを削除する MQGET 呼び出し。
  • キュー上のメッセージをブラウズする MQGET 呼び出し。
任意のキュー・ハンドルについて、アプリケーションは、 MQGMO_LOGICAL_ORDER を指定する MQGET 呼び出しと、指定しない MQGET 呼び出しを混在させることができます。 ただし、以下の点に注意してください。
  • MQGMO_LOGICAL_ORDER を省略した場合、MQGET 呼び出しが成功するたびに、キュー・マネージャーは、保存されているグループおよびセグメント情報を、戻されたメッセージに対応する値に変更して設定します。つまり、キュー・ハンドルに対してキュー・マネージャーで保持されていた既存のグループおよびセグメント情報が、この値で置換されます。 呼び出しのアクション (ブラウズまたは削除) に該当する情報だけが変更されます。
  • MQGMO_LOGICAL_ORDERを省略すると、現行のメッセージ・グループまたは論理メッセージがあっても呼び出しは失敗しません。呼び出しは成功し、MQCC_WARNING完了コードが出される場合があります。 表 3 に、発生する可能性のあるさまざまなケースを示します。 これらの場合、完了コードがMQCC_OKでなければ、理由コードは以下のいずれか (該当するもの) になります。
    • MQRC_INCOMPLETE_GROUP
    • MQRC_INCOMPLETE_MSG
    • MQRC_INCONSISTENT_UOW
    注: キューをブラウズする場合、またはブラウズ用にオープンされたが入力用ではないキューをクローズする場合、キュー・マネージャーはグループおよびセグメントの情報を検査しません。これらの場合、完了コードは常に MQCC_OK (他のエラーがないことを想定) です。
表 3. MQGET または MQCLOSE 呼び出しがグループおよびセグメント情報と整合していない場合の結果
現行の呼び出し 前の呼び出しは、 MQGMO_LOGICAL_ORDER を指定した MQGET でした。 前の呼び出しは MQGMO_LOGICAL_ORDERMQGET 指定しない
MQGETMQGMO_LOGICAL_ORDER MQCC_FAILED MQCC_FAILED
MQGET (MQGMO_LOGICAL_ORDER なし) MQCC_WARNING MQCC_OK
終了していないグループまたは論理メッセージを指定している MQCLOSE MQCC_WARNING MQCC_OK

メッセージおよびセグメントを論理順序でリトリーブしたいアプリケーションは、MQGMO_LOGICAL_ORDERを指定することをお勧めします。これは、使用する最も簡単なオプションであるためです。 このオプションを指定すると、キュー・マネージャーがグループおよびセグメント情報を管理するので、アプリケーションでこの情報を管理する必要はなくなります。 ただし、特殊アプリケーションは、MQGMO_LOGICAL_ORDERオプションによって提供される制御よりも多くの制御を必要とする場合があります。これは、そのオプションを指定しないことによって行うことができます。 その後、アプリケーションは、各 MQGET 呼び出しの前に、 MQMDMsgIdCorrelIdGroupIdMsgSeqNumber、および Offset フィールド、および MQGMOMatchOptionsMQMO_* オプションが正しく設定されていることを確認する必要があります。

例えば、受信する物理メッセージがグループ内にあるか、論理メッセージのセグメント内にあるかに関係なく、それらのメッセージを転送するアプリケーションでは、MQGMO_LOGICAL_ORDERを指定してはなりません。 送信側のキュー・マネージャーと受信側のキュー・マネージャーの間にパスが複数あるような複雑なネットワークの場合には、物理メッセージが正しくない順序で到達することがあります。 MQGMO_LOGICAL_ORDERも、MQPUT 呼び出しで対応するMQPMO_LOGICAL_ORDERも指定しないことによって、転送アプリケーションは、論理順序で次の物理メッセージが到着するのを待たずに、到着するとすぐに各物理メッセージを検索して転送することができます。

MQGMO_LOGICAL_ORDERは、他のどのMQGMO_*オプションとも一緒に指定できます。また、該当する状況ではさまざまなMQMO_*オプションと一緒に指定できます (前のセクションを参照してください)。
  • [z/OS] z/OSでは、このオプションは専用キューおよび共用キューでサポートされますが、キューの索引タイプは MQIT_GROUP_IDでなければなりません。 共有キューの場合、キューのマップ先の CFSTRUCT オブジェクトは CFLEVEL(3) 以上でなければなりません。
  • このオプションは、以下のプラットフォームのすべてのローカル・キューでサポートされています。
    • [AIX]AIX
    • [Linux]Linux
    • [IBM i]IBM i
    • [Windows]Windows
    およびこれらのシステムに接続された IBM MQ MQI clients の場合。
MQGMO_COMPLETE_MSG
完全な論理メッセージだけを MQGET 呼び出しで戻すことができます。 論理メッセージがセグメント化されていると、キュー・マネージャーはそれらのセグメントの再組み立てを行い、完全な論理メッセージをアプリケーションに戻します。論理メッセージがセグメント化されていたことは、それを受け取るアプリケーションには分かりません。
注: これは、キュー・マネージャーにメッセージ・セグメントを再アセンブルさせる唯一のオプションです。 このオプションを指定しないと、キューに入っている (および MQGET 呼び出しで指定された他の選択基準を満たしている) セグメントはそれぞれ個別にアプリケーションに戻されます。 アプリケーションでセグメントを個別に受け取りたくない場合は、必ず MQGMO_COMPLETE_MSG を指定する必要があります。

このオプションを使用するには、アプリケーションが完全なメッセージを収容するのに十分な大きさのバッファーを提供するか、MQGMO_ACCEPT_TRUNCATED_MSGオプションを指定する必要があります。

キューにセグメント化されたメッセージがあり、いくつかのセグメントが欠落している場合 (ネットワーク内で遅延し、まだ到着していないことが原因である可能性があります)、MQGMO_COMPLETE_MSGを指定すると、不完全な論理メッセージに属するセグメントを取得できなくなります。 ただし、これらのメッセージ・セグメントは引き続きCurrentQDepthキュー属性の値に寄与します。これは、CurrentQDepthがゼロより大きい場合でも、検索可能な論理メッセージが存在しない可能性があることを意味します。

持続メッセージの場合、キュー・マネージャーがセグメントの再組み立てを実行できるのは、1 つの作業単位内でだけです。
  • MQGET 呼び出しがユーザー定義の作業単位内で実行されていれば、その作業単位が使用されます。 呼び出しが再組み立て処理中に失敗した場合、キュー・マネージャーは、再組み立て中に削除されたすべてのセグメントをキューに復元します。 ただし、このように失敗しても、作業単位は正常にコミットされます。
  • 呼び出しがユーザー定義の作業単位外で実行されていて、またユーザー定義の作業単位が存在していない場合、キュー・マネージャーは、この呼び出しの間の作業単位を作成します。 呼び出しが成功すると、キュー・マネージャーは作業単位を自動的にコミットします (アプリケーションでこれを行う必要はありません)。 呼び出しが失敗すると、キュー・マネージャーは作業単位をバックアウトします。
  • 呼び出しがユーザー定義の作業単位外で実行されているが、ユーザー定義の作業単位が存在している場合、キュー・マネージャーは再組み立てを実行できません。 再組み立てが必要でないメッセージでは、呼び出しが成功することもあります。 しかし、メッセージの再組み立てが必要な場合は、呼び出しは理由コード MQRC_UOW_NOT_AVAILABLEで失敗します。

非持続メッセージの場合、キュー・マネージャーが再組み立てを実行するのに、作業単位が使用可能になっている必要はありません。

1 つのセグメントであるそれぞれの物理メッセージには、固有のメッセージ記述子があります。 単一の論理メッセージを構成するセグメントの場合、メッセージ記述子内のほとんどのフィールドは、論理メッセージ内のすべてのセグメントで同じです。通常、論理メッセージ内のセグメント間で異なるのは、MsgIdOffset、およびMsgFlagsフィールドのみです。 ただし、セグメントが中間キュー・マネージャーの送達不能キューに置かれている場合、DLQ ハンドラーはMQGMO_CONVERTオプションを指定してメッセージを取得します。これにより、セグメントの文字セットまたはエンコードが変更される可能性があります。 それで、この途中で DLQ ハンドラーがセグメントの送信に成功した場合、そのセグメントが宛先キュー・マネージャーに到着した時点で、そのセグメントの文字セットまたはエンコードは論理メッセージ内の他のセグメントと異なっていることがあります。

CodedCharSetIdフィールドとEncodingフィールドが異なるセグメントで構成される論理メッセージを、キュー・マネージャーが単一の論理メッセージに再組み立てすることはできません。 その代わりに、キュー・マネージャーは、論理メッセージの先頭にあり、同じ文字セット ID とエンコードを持つ連続したセグメントをいくつか再組み立てして戻します。このとき、MQGET 呼び出しは完了し、完了コード MQCC_WARNING と、理由コード MQRC_INCONSISTENT_CCSIDS または MQRC_INCONSISTENT_ENCODINGS の該当する方が戻ります。 これは、MQGMO_CONVERTが指定されているかどうかに関係なく発生します。 残りのセグメントをリトリーブするには、アプリケーションは MQGMO_COMPLETE_MSG オプションを指定せずに MQGET 呼び出しを再発行し、セグメントを 1 つずつリトリーブする必要があります。 MQGMO_LOGICAL_ORDERを使用して、残りのセグメントを順番に取り出すことができます。

セグメントの書き込みを行うアプリケーションでは、メッセージ記述子内の他のフィールドに、セグメント間で異なる値を設定できます。 ただし、受信側アプリケーションがMQGMO_COMPLETE_MSGを使用して論理メッセージを検索する場合は、これを行う利点はありません。 キュー・マネージャーは、論理メッセージの再組み立て時に、最初のセグメントのメッセージ記述子からの値をメッセージ記述子に戻します。唯一の例外はMsgFlagsフィールドで、再組み立てされたメッセージが唯一のセグメントであることを示すためにキュー・マネージャーが設定します。

レポート・メッセージにMQGMO_COMPLETE_MSGが指定されている場合、キュー・マネージャーは特殊な処理を実行します。 キュー・マネージャーは、キューをチェックして、論理メッセージ内のさまざまなセグメントに関連するそのレポート・タイプのすべてのレポート・メッセージがキュー上に存在しているかどうかを確認します。 正しい場合は、MQGMO_COMPLETE_MSGを指定することにより、単一メッセージとして取り出すことができます。 これを可能にするには、セグメント化をサポートするキュー・マネージャーまたは MCA によってレポート・メッセージを生成するか、発信元アプリケーションが少なくとも 100 バイトのメッセージ・データを要求する必要があります (つまり、適切なMQRO_*_WITH_DATAまたはMQRO_*_WITH_FULL_DATAオプションを指定する必要があります)。 1 つのセグメントに入るアプリケーション・データの一部に欠落があると、戻されるレポート・メッセージでは、足りないバイト分はヌルで置き換えられます。

MQGMO_COMPLETE_MSGMQGMO_MSG_UNDER_CURSORまたはMQGMO_BROWSE_MSG_UNDER_CURSORとともに指定されている場合、MQMD 内のOffsetフィールドの値が 0 であるメッセージにブラウズ・カーソルを配置する必要があります。 この条件が満たされない場合、呼び出しは失敗し、理由コードMQRC_INVALID_MSG_UNDER_CURSORが戻ります。

MQGMO_COMPLETE_MSGMQGMO_ALL_SEGMENTS_AVAILABLEを暗黙指定するため、指定する必要はありません。

MQGMO_COMPLETE_MSGは、MQGMO_SYNCPOINT_IF_PERSISTENT以外の任意のMQGMO_*オプション、および MQMO_MATCH_OFFSET 以外の任意のMQMO_*オプションと一緒に指定することができます。
  • [z/OS] z/OSでは、このオプションは専用キューおよび共用キューでサポートされますが、キューの索引タイプは MQIT_GROUP_ID でなければなりません。 共有キューの場合、キューのマップ先である CFSTRUCT オブジェクトは CFLEVEL(3) 以上でなければなりません。
  • 以下のプラットフォーム:
    • [AIX]AIX
    • [IBM i]IBM i
    • [Linux]Linux
    • [Windows]Windows
    また、これらのシステムに接続されている IBM MQ MQI clients の場合、このオプションはすべてのローカル・キューでサポートされます。
MQGMO_ALL_MSGS_AVAILABLE
グループ内のメッセージがすべて使用可能な場合に限り、そのグループ内のメッセージを取得できるようになります。 キューにいくつかのメッセージが欠落しているメッセージ・グループが含まれている場合 (ネットワーク内で遅延していて、まだ到着していないなどの理由で)、MQGMO_ALL_MSGS_AVAILABLEを指定すると、不完全なグループに属するメッセージを取得できなくなります。 ただし、これらのメッセージは引き続きCurrentQDepthキュー属性の値に寄与します。これは、CurrentQDepthがゼロより大きい場合でも、検索可能なメッセージ・グループが存在しない可能性があることを意味します。 検索可能なメッセージが他にない場合は、指定された待機間隔 (ある場合) が経過した後で、理由コードMQRC_NO_MSG_AVAILABLEが戻されます。
MQGMO_ALL_MSGS_AVAILABLEの処理は、MQGMO_LOGICAL_ORDERも指定されているかどうかによって異なります。
  • 両方のオプションを指定すると、MQGMO_ALL_MSGS_AVAILABLEは、現行のグループまたは論理メッセージがない場合にのみ有効になります。 現行のグループまたは論理メッセージがある場合、MQGMO_ALL_MSGS_AVAILABLEは無視されます。 これは、メッセージを論理順序で処理するときにMQGMO_ALL_MSGS_AVAILABLEがオンのままである可能性があることを意味します。
  • MQGMO_LOGICAL_ORDERを指定せずにMQGMO_ALL_MSGS_AVAILABLEを指定すると、MQGMO_ALL_MSGS_AVAILABLEは常に効果を持ちます。 つまり、このオプションは、グループ内の最初のメッセージがキューから削除されたときにオフにする必要があります。これによって、そのグループ内の残りのメッセージを削除できるようになります。

MQGMO_ALL_MSGS_AVAILABLE を指定した MQGET 呼び出しが正常終了したということは、 MQGET 呼び出しが発行された時点で、グループ内のすべてのメッセージがキューにあったことを意味します。 しかし、それでも他のアプリケーションが、グループからメッセージを削除できることに注意してください (グループは、グループ内の最初のメッセージを取得するアプリケーションに対してロックされていません)。

このオプションを省略すると、不完全なグループに属しているメッセージが取得されることがあります。

MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEを暗黙指定するため、指定する必要はありません。

MQGMO_ALL_MSGS_AVAILABLEは、他の任意のMQGMO_*オプション、および任意のMQMO_*オプションと一緒に指定することができます。
  • [z/OS] z/OSでは、このオプションは専用キューおよび共用キューでサポートされますが、キューの索引タイプは MQIT_GROUP_ID でなければなりません。 共有キューの場合、キューのマップ先である CFSTRUCT オブジェクトは CFLEVEL(3) 以上でなければなりません。
  • 以下のプラットフォーム:
    • [AIX]AIX
    • [IBM i]IBM i
    • [Linux]Linux
    • [Windows]Windows
    また、これらのシステムに接続されている IBM MQ MQI clients の場合、このオプションはすべてのローカル・キューでサポートされます。
MQGMO_ALL_SEGMENTS_AVAILABLE
論理メッセージ内のセグメントがすべて使用可能な場合に限り、その論理メッセージ内のセグメントを取得できるようになります。 キューにセグメント化されたメッセージがあり、いくつかのセグメントが欠落している場合 (ネットワーク内で遅延し、まだ到着していないことが原因である可能性があります)、MQGMO_ALL_SEGMENTS_AVAILABLEを指定すると、不完全な論理メッセージに属するセグメントを取得できなくなります。 ただし、これらのセグメントは引き続きCurrentQDepthキュー属性の値に加算されます。これは、CurrentQDepthがゼロより大きい場合でも、検索可能な論理メッセージがない可能性があることを意味します。 検索可能なメッセージが他にない場合は、指定された待機間隔 (ある場合) が経過した後で、理由コードMQRC_NO_MSG_AVAILABLEが戻されます。

MQGMO_ALL_SEGMENTS_AVAILABLEの処理は、MQGMO_LOGICAL_ORDERも指定されているかどうかによって異なります。
  • 両方のオプションを指定した場合、MQGMO_ALL_SEGMENTS_AVAILABLEが有効になるのは、現行の論理メッセージが存在しない場合のみです。 現行の論理メッセージがある場合、MQGMO_ALL_SEGMENTS_AVAILABLEは無視されます。 これは、メッセージを論理順序で処理するときにMQGMO_ALL_SEGMENTS_AVAILABLEがオンのままである可能性があることを意味します。
  • MQGMO_LOGICAL_ORDERを指定せずにMQGMO_ALL_SEGMENTS_AVAILABLEを指定すると、MQGMO_ALL_SEGMENTS_AVAILABLEは常に効果を持ちます。 つまり、このオプションは、論理メッセージ内の最初のセグメントがキューから削除されたときにオフにする必要があります。これによって、その論理メッセージ内の残りのセグメントを削除できるようになります。

このオプションを指定しないと、論理メッセージが不完全な場合でも、メッセージ・セグメントが取得されることがあります。

MQGMO_COMPLETE_MSGMQGMO_ALL_SEGMENTS_AVAILABLEの両方とも、いずれかのセグメントを取得する前にすべてのセグメントが使用可能になっている必要がありますが、前者は完全なメッセージを返し、後者はセグメントを 1 つずつ取得することを許可します。

レポート・メッセージにMQGMO_ALL_SEGMENTS_AVAILABLEが指定されている場合、キュー・マネージャーはキューを検査して、完全な論理メッセージを構成するセグメントごとに少なくとも 1 つのレポート・メッセージがあるかどうかを確認します。 存在する場合は、MQGMO_ALL_SEGMENTS_AVAILABLE条件が満たされます。 しかし、キュー・マネージャーは、キューに入っているレポート・メッセージのタイプ はチェックしないので、論理メッセージのセグメントに対応したレポート・メッセージにはさまざまなタイプのレポートが混在している可能性があります。 結果として、MQGMO_ALL_SEGMENTS_AVAILABLEが成功しても、MQGMO_COMPLETE_MSGが成功することを意味するわけではありません。 ある論理メッセージのセグメントについてさまざまなレポート・タイプが混在している場合には、これらのレポート・メッセージは 1 つずつ取得する必要があります。

MQGMO_ALL_SEGMENTS_AVAILABLEは、他の任意のMQGMO_*オプション、および任意のMQMO_*オプションと一緒に指定することができます。
  • z/OSでは、このオプションは専用キューおよび共用キューでサポートされますが、キューの索引タイプは MQIT_GROUP_ID でなければなりません。 共有キューの場合、キューのマップ先である CFSTRUCT オブジェクトは CFLEVEL(3) 以上でなければなりません。
  • 以下のプラットフォーム:
    • [AIX]AIX
    • [IBM i]IBM i
    • [Linux]Linux
    • [Windows]Windows
    また、これらのシステムに接続されている IBM MQ MQI clients の場合、このオプションはすべてのローカル・キューでサポートされます。

プロパティー・オプション

以下のオプションは、メッセージのプロパティーに関連したオプションです。
MQGMO_PROPERTIES_AS_Q_DEF

メッセージ記述子 (または拡張) に含まれるプロパティーを除き、メッセージのプロパティーは、PropertyControlキュー属性の定義に従って表す必要があります。 MsgHandleが指定されている場合、PropertyControlキュー属性の値がMQPROP_FORCE_MQRFH2でない限り、このオプションは無視され、メッセージのプロパティーはMsgHandleを介して使用可能になります。

これは、プロパティー・オプションが指定されていないときのデフォルト・アクションです。

MQGMO_PROPERTIES_IN_HANDLE

メッセージのプロパティーは、MsgHandleを介して使用可能にする必要があります。 メッセージ・ハンドルが提供されない場合、呼び出しは理由MQRC_HMSG_ERRORで失敗します。

注: 後でメッセージ・ハンドルを作成しないアプリケーションによってメッセージが読み取られると、キュー・マネージャーはメッセージ・プロパティーを MQRFH2 構造体に入れます。 予期しない MQRFH2 ヘッダーの存在によって、既存のアプリケーションの動作が妨げられる可能性もあります。
MQGMO_NO_PROPERTIES

メッセージ記述子 (または拡張) に含まれるものを除き、メッセージのプロパティーは取得されません。 MsgHandleが指定されている場合は、無視されます。

MQGMO_PROPERTIES_FORCE_MQRFH2

メッセージ記述子 (または拡張) に含まれるプロパティーを除き、メッセージのプロパティーはMQRFH2ヘッダーを使用して表す必要があります。 これにより、プロパティーを取得することが予期されるものの、メッセージ・ハンドルを使用するように変更できない、アプリケーションの以前のバージョンとの互換性が提供されます。 MsgHandleが指定されている場合は無視されます。

MQGMO_PROPERTIES_COMPATIBILITY
メッセージに "mcd.""jms.""usr."、または "mqext."の接頭部を持つプロパティーが含まれている場合、すべてのメッセージ・プロパティーが MQRFH2 ヘッダーでアプリケーションに配信されます。 それ以外の場合、メッセージ記述子 (または拡張) に含まれるものを除くメッセージのプロパティーはすべて廃棄され、アプリケーションにアクセスできなくなります。

デフォルト・オプション

説明されているオプションがどれも必要でない場合には、以下のオプションを使用できます。
MQGMO_NONE
この値は、他のオプションが指定されなかったことを示すために使用します。すべてのオプションはデフォルト値であるとみなされます。 MQGMO_NONEは、プログラムの文書化を支援します。このオプションを他のオプションと一緒に使用することは意図されていませんが、値がゼロであるため、そのような使用を検出できません。

Optionsフィールドの初期値は、MQGMO_NO_WAITMQGMO_PROPERTIES_AS_Q_DEFを加えた値です。

1 MQGMO_LOCK オプションを指定した MQGET 呼び出しは、非ブラウズ呼び出しとして扱われます。