MQGMO のオプション (MQLONG)
- 値を加算する (同じ定数は 2 回以上加算しない)
- ビット単位の OR 演算を使用して値を結合する (プログラミング言語がビット演算をサポートしている場合)
待機オプション
- MQGMO_WAIT
- アプリケーションは、適切なメッセージが到着するまで待機します。 アプリケーションが待機する最大時間は、
WaitIntervalに指定されています。重要: 適切なメッセージがすぐに使用可能な場合は、待機も遅延もありません。MQGET 要求が使用禁止になっている場合や、待機中に MQGET 要求が使用禁止になる場合は、待機が取り消されます。 キューに適切なメッセージがあるかどうかに関係なく、呼び出しは
MQCC_FAILEDおよび理由コードMQRC_GET_INHIBITEDで完了します。MQGMO_WAITは、オプションまたはMQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXTオプションとともに使用できます。同じ共有キューでいくつかのアプリケーションが待機している場合は、以下の規則に従い、適切なメッセージが到着したときに活動化されるアプリケーションが選択されます。
BROWSE オプションを指定しない複数の MQGET 呼び出しが同じキューで待機している場合、1 つの呼び出しのみが活動化されます。 キュー・マネージャーは、待機中の呼び出しに対して以下の順序で優先順位を与えます。表 1. 共用キューで MQGET 呼び出しを活動化するための規則。 活動化されるのを待機している MQGET 呼び出しの数 結果 BROWSE オプションを使用する場合 BROWSE オプションなし 1 なし 1 以上 BROWSE オプションを指定しない 1 つの MQGET 呼び出しが活動化されます。 1 以上 なし BROWSE オプションを指定したすべての MQGET 呼び出しが活動化されます。 1 以上 1 以上 BROWSE オプションを指定しない 1 つの MQGET 呼び出しが活動化されます。 BROWSE オプションを指定した MQGET 呼び出しのうち、活動化される呼び出しの数は予測できません。 - 特定のメッセージによってのみ満たすことができる特定の get-wait 要求。例えば、特定の
MsgIdまたはCorrelId(あるいはその両方) を持つ要求。 - どのメッセージによっても満たすことができる一般的な get-wait 要求。
注:- 最初のカテゴリー内では、より具体的な get - wait 要求に優先順位を追加することはできません。 例えば、
MsgIdとCorrelIdの両方を指定する要求などです。 - いずれのカテゴリーでも、どのアプリケーションが選択されるか予測はできません。 特に、待機時間が長いアプリケーションから選択されるとは限りません。
- オペレーティング・システムのパス長および優先順位スケジューリングが考慮された結果、待機中のアプリケーションのうち、予期された優先順位より低いオペレーティング・システムの優先順位を持つアプリケーションがメッセージを取得する場合もあります。
- 待機をしていないアプリケーションのほうが、待機中のアプリケーションより優先されてメッセージを取得することもあります。
z/OS®では、以下の点が適用されます。- メッセージの到着を待機している間に、アプリケーションが他の作業を続行するようにしたい場合は、代わりにシグナル・オプション (
MQGMO_SET_SIGNAL) を使用することを検討してください。 ただし、シグナル・オプションは環境固有のものなので、異なる環境との間で移植するアプリケーションではこれを使用してはなりません。 - 複数の MQGET 呼び出しが同じメッセージを待機している場合、待機オプションとシグナル・オプションが混在していても、各待機呼び出しは同等に扱われます。
MQGMO_WAITでMQGMO_SET_SIGNALを指定するとエラーになります。 また、未解決のシグナルがあるキュー・ハンドルと共にこのオプションを指定した場合も、エラーになります。 MQIT_MSG_TOKENのIndexTypeを持つキューに対してMQGMO_WAITまたはMQGMO_SET_SIGNALを指定した場合、選択基準は許可されません。 つまり、以下のようになります。- version-1
MQGMOを使用している場合は、 MQGET 呼び出しで指定した MQMD のMsgIdおよびCorrelIdフィールドをMQMI_NONEおよびMQCI_NONEに設定します。 - version-2 以降
MQGMOを使用している場合は、MatchOptionsフィールドをMQMO_NONEに設定します。
- version-1
- 共有キューに対する 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と一緒に指定しても無視されます。エラーは発生しません。 - 特定のメッセージによってのみ満たすことができる特定の get-wait 要求。例えば、特定の
- MQGMO_NO_WAIT
- 適切なメッセージを入手できない場合、アプリケーションは待機しません。
MQGMO_NO_WAITは、MQGMO_WAITの反対です。MQGMO_NO_WAITは、プログラム文書化を支援するために定義されています。 いずれも指定されていないときは、これがデフォルト値になります。 - MQGMO_SET_SIGNAL
- このオプションは、
Signal1フィールドおよびSignal2フィールドとともに使用します。 このオプションにより、アプリケーションは、メッセージの到着を待つ間に他の作業の処理を進めることができます。 また、アプリケーションは、複数のキューに到着するメッセージを待つことができます (適切なオペレーティング・システム機能が使用可能な場合)。注:MQGMO_SET_SIGNALオプションは環境によって異なります。移植したいアプリケーションには使用しないでください。次の 2 つの状況においては、このオプションが指定されていない場合と同様の方法で呼び出しが完了します。- 現在使用可能なメッセージが、メッセージ記述子に指定されている基準を満たしている場合。
- パラメーター・エラーやその他の同期エラーが検出された場合。
メッセージ記述子に指定されている基準を満たすメッセージがどれも現在使用可能でない場合は、メッセージの到着を待たずに制御がアプリケーションに戻されます。 CompCodeおよびReasonパラメーターは、
MQCC_WARNINGおよびMQRC_SIGNAL_REQUEST_ACCEPTEDに設定されます。 その他のメッセージ記述子内の出力フィールド、および MQGET 呼び出しの出力パラメーターは、設定されません。 その後、適切なメッセージが到着すると、ECB を通知することによってシグナルが送達されます。この後、呼び出し元は MQGET 呼び出しを再発行して、メッセージを取得する必要があります。 アプリケーションは、オペレーティング・システムが提供する関数を使用して、このシグナルを待機することができます。
オペレーティング・システムが複数待機のメカニズムを提供している場合、そのメカニズムを利用して複数のキューのいずれかにメッセージが到着するのを待機できます。
ゼロ以外の
WaitIntervalが指定された場合、待機間隔が満了した後にシグナルが送信されます。 キュー・マネージャーは待機をキャンセルすることもでき、その場合、シグナルが送達されます。複数の MQGET 呼び出しが同じメッセージ用のシグナルを設定する場合があります。 アプリケーションが活動化される順序は、
MQGMO_WAITで説明されている順序と同じです。複数の MQGET 呼び出しが同じメッセージを待機している場合、各待機呼び出しは同等に扱われます。 複数の呼び出しで、待機オプションとシグナル・オプションが混在していても構いません。
特定の条件下では、MQGET 呼び出しがメッセージを取得し、そのメッセージが到着した結果として生成されたシグナルが送達される場合があります。 シグナルが送達される場合、アプリケーションは、使用可能なメッセージがない状態に対する準備ができていなければなりません。
1 つのキュー・ハンドルに、複数の未解決のシグナル要求があってはなりません。
このオプションと組み合わせて使用できないオプションは、以下のとおりです。MQGMO_UNLOCKMQGMO_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 でのみサポートされます。 - MQGMO_FAIL_IF_QUIESCING
- キュー・マネージャーが静止状態にある場合、MQGET 呼び出しを強制的に失敗させます。
z/OSでは、このオプションは、接続 ( CICS® または IMS アプリケーションの場合) が静止状態の場合にも、 MQGET 呼び出しを強制的に失敗させます。このオプションがMQGMO_WAITまたはMQGMO_SET_SIGNALとともに指定され、キュー・マネージャーが静止状態になった時点で待機またはシグナルが未解決である場合は、以下のようになります。- 待機は取り消され、呼び出しは完了コード
MQCC_FAILEDと理由コードMQRC_Q_MGR_QUIESCINGまたはMQRC_CONNECTION_QUIESCINGを戻します。 - シグナルが、環境固有のシグナル完了コードと共に取り消されます。
z/OSでは、シグナルはイベント完了コード MQEC_Q_MGR_QUIESCINGまたはMQEC_CONNECTION_QUIESCINGで完了します。
MQGMO_FAIL_IF_QUIESCINGが指定されず、キュー・マネージャーまたは接続が静止状態に入った場合、待機またはシグナルは取り消されません。 - 待機は取り消され、呼び出しは完了コード
同期点オプション
- MQGMO_SYNCPOINT
- この要求は、通常の作業単位プロトコルの中で操作することです。 メッセージには、他のアプリケーションでは使用できないものとしてマークが付けられますが、作業単位がコミットされたときにのみ、キューから削除されます。 作業単位がバックアウトされると、メッセージは再び使用可能になります。
MQGMO_SYNCPOINTおよびMQGMO_NO_SYNCPOINTを設定解除したままにすることができます。 その場合、get 要求の作業単位プロトコルへの組み込みは、キュー・マネージャーの実行環境によって決定されます。 アプリケーションの実行環境によって決定されるのではありません。
z/OSでは、get 要求は作業単位内にあります。- z/OS以外のすべての環境では、get 要求は作業単位内にありません。
このような違いがあるため、移植するアプリケーションでは、このオプションをデフォルトにすることはできません。
MQGMO_SYNCPOINTまたはMQGMO_NO_SYNCPOINTを明示的に指定してください。このオプションと組み合わせて使用できないオプションは、以下のとおりです。MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_LOCKMQGMO_NO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
- MQGMO_SYNCPOINT_IF_PERSISTENT
- この要求は、取り出されたメッセージが持続する場合に限り、標準の作業単位プロトコル内で機能します。 持続メッセージは、MQMD の
Persistenceフィールドに値MQPER_PERSISTENTを持ちます。- メッセージが持続メッセージの場合、キュー・マネージャーは、アプリケーションが
MQGMO_SYNCPOINTを指定したかのように呼び出しを処理します。 - メッセージが持続メッセージでない場合、キュー・マネージャーは、アプリケーションが
MQGMO_NO_SYNCPOINTを指定したかのように呼び出しを処理します。
このオプションと組み合わせて使用できないオプションは、以下のとおりです。MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_COMPLETE_MSGMQGMO_MARK_SKIP_BACKOUTMQGMO_NO_SYNCPOINTMQGMO_SYNCPOINTMQGMO_UNLOCK
このオプションは、次の環境でサポートされます。
AIX®
IBM® i
Linux®
z/OS
- メッセージが持続メッセージの場合、キュー・マネージャーは、アプリケーションが
- MQGMO_NO_SYNCPOINT
- この要求は、通常の作業単位プロトコルの外部で動作することになります。 ブラウズ・オプションなしのメッセージを受け取った場合、メッセージは直ちにキューから削除されます。 作業単位をバックアウトすることによって、メッセージを再度使用可能にすることはできません。
このオプションは、
MQGMO_BROWSE_FIRSTまたはMQGMO_BROWSE_NEXTを指定した場合に想定されます。MQGMO_SYNCPOINTおよびMQGMO_NO_SYNCPOINTを設定解除したままにすることができます。 その場合、get 要求の作業単位プロトコルへの組み込みは、キュー・マネージャーの実行環境によって決定されます。 アプリケーションの実行環境によって決定されるのではありません。
z/OSでは、get 要求は作業単位内にあります。- z/OS以外のすべての環境では、get 要求は作業単位内にありません。
このような違いがあるため、移植するアプリケーションでは、このオプションをデフォルトにすることはできません。
MQGMO_SYNCPOINTまたはMQGMO_NO_SYNCPOINTのいずれかを明示的に指定してください。このオプションと組み合わせて使用できないオプションは、以下のとおりです。MQGMO_MARK_SKIP_BACKOUTMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENT
MQGMO_MARK_SKIP_BACKOUT- このオプションでマークしたメッセージをキュー上に復元せずに、作業単位をバックアウトします。
ブラウズ・オプション
- MQGMO_BROWSE_FIRST
- キューが MQOO_BROWSE オプション付きでオープンされる場合、ブラウズ・カーソルが設定され、論理的にキューの最初のメッセージの前に配置されます。 その後 MQGET 呼び出しを使用するときに
MQGMO_BROWSE_FIRST、MQGMO_BROWSE_NEXT、またはMQGMO_BROWSE_MSG_UNDER_CURSORオプションを指定すると、キューからメッセージを非破壊的に取得することができます。 ブラウズ・カーソルは、キュー上のメッセージ内の位置をマークします。MQGMO_BROWSE_NEXTを指定した次の MQGET 呼び出しは、この位置から適切なメッセージを検索します。MQGMO_BROWSE_FIRSTは、以下のいずれかのオプションでは無効です。MQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_MARK_SKIP_BACKOUTMQGMO_MSG_UNDER_CURSORMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_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_MSG_UNDER_CURSOR
- MQGMO の
MatchOptionsフィールドに指定されたMQMO_*オプションに関係なく、ブラウズ・カーソルによって指示されたメッセージを非破壊的に取り出します。 - MQGMO_MSG_UNDER_CURSOR
- MQGMO の
MatchOptionsフィールドに指定されているMQMO_*オプションに関係なく、ブラウズ・カーソルが指すメッセージを検索します。 メッセージはキューから削除されます。ブラウズ・カーソルによって示されるメッセージは、
MQGMO_BROWSE_FIRSTオプションまたはMQGMO_BROWSE_NEXTオプションのいずれかを使用して最後に取得されたメッセージです。MQGMO_COMPLETE_MSGがMQGMO_MSG_UNDER_CURSORとともに指定されている場合、ブラウズ・カーソルは、MQMD 内のOffsetフィールドがゼロであるメッセージを識別する必要があります。 この条件が満たされない場合、呼び出しは失敗し、理由コードMQRC_INVALID_MSG_UNDER_CURSORが戻ります。このオプションと組み合わせて使用できないオプションは、以下のとおりです。MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXTMQGMO_UNLOCK
- MQGMO_MARK_BROWSE_HANDLE
- 正常な MQGET によって戻されたメッセージ、または戻された
MsgTokenによって識別されるメッセージにマークが付けられます。 マークは、呼び出しで使用されるオブジェクト・ハンドルに固有のものです。メッセージはキューから削除されません。
MQGMO_MARK_BROWSE_HANDLEは、以下のいずれかのオプションも指定されている場合にのみ有効です。MQGMO_BROWSE_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXT
MQGMO_MARK_BROWSE_HANDLEは、以下のいずれかのオプションでは無効です。MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_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_FIRSTMQGMO_BROWSE_MSG_UNDER_CURSORMQGMO_BROWSE_NEXT
このオプションと組み合わせて使用できないオプションは、以下のとおりです。MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_UNLOCK
メッセージが既にマークされており、オプション
MQGMO_UNMARKED_BROWSE_MSGが指定されていない場合、呼び出しはMQCC_FAILEDおよび理由コードMQRC_MSG_MARKED_BROWSE_CO_OPで失敗します。メッセージは、次のいずれかのイベントが発生するまでこの状態のままとなります。- 協働セットのオブジェクト・ハンドルすべてがクローズされる。
- オプション
MQGMO_UNMARK_BROWSE_CO_OPを指定して MQGET を呼び出すと、連携ブラウザーのメッセージのマークが解除されます。 - キュー・マネージャーによってメッセージが自動的にマーク解除される。
- メッセージが非ブラウズ MQGET の呼び出しから戻される。 MQGET が後でロールバックされた場合も、メッセージの状態は変更されたままです。
- メッセージの有効期限が切れる。
MQGMO_UNMARKED_BROWSE_MSGMQGMO_UNMARKED_BROWSE_MSGを指定して MQGET を呼び出すと、ハンドルのマークが解除されたと見なされるメッセージが返されます。 ハンドルに対してマークが付けられたメッセージは戻しません。 また、キューがオプションMQOO_CO_OPを指定した MQOPENの呼び出しによってオープンされ、メッセージが連携セットのメンバーによってマークされている場合も、メッセージを戻しません。このオプションと組み合わせて使用できないオプションは、以下のとおりです。MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_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_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_MARK_BROWSE_CO_OPMQGMO_UNLOCKMQGMO_UNMARKED_BROWSE_MSG
- MQGMO_UNMARK_BROWSE_HANDLE
- このオプションを指定して MQGET を呼び出すと、置かれているメッセージは、このハンドルからは、マーク付けされているメッセージとみなされなくなります。
呼び出しは、このハンドルに対してメッセージがマークされていなくても成功します。
このオプションは、非ブラウズ MQGET 呼び出しでは無効であり、以下のオプションと組み合わせて使用することもできません。MQGMO_ALL_MSGS_AVAILABLEMQGMO_ALL_SEGMENTS_AVAILABLEMQGMO_COMPLETE_MSGMQGMO_LOCKMQGMO_LOGICAL_ORDERMQGMO_MARK_BROWSE_CO_OPMQGMO_UNLOCKMQGMO_UNMARKED_BROWSE_MSG
ロック・オプション
- MQGMO_LOCK
- ブラウズされるメッセージをロックします。ロックされたメッセージは、このキューに対してオープンされた他のハンドルからは見えなくなります。 このオプションを指定できるのは、以下のオプションのいずれか 1 つが指定されている場合に限ります。
MQGMO_BROWSE_FIRSTMQGMO_BROWSE_NEXTMQGMO_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_WARNINGがMQRC_TRUNCATED_MSG_FAILEDで返された場合、メッセージはアンロックされません。MQCC_FAILEDがMQRC_NO_MSG_AVAILABLEとともに返された場合、メッセージはアンロックされます。
MQGMO_LOCKも指定した場合、返されるメッセージはロックされます。MQGMO_LOCKを省略すると、呼び出し後にロックされたメッセージは表示されません。MQGMO_WAITを指定し、すぐに使用可能なメッセージがない場合は、待機の開始前に元のメッセージがアンロックされます。MQGMO_BROWSE_MSG_UNDER_CURSORを指定し、MQGMO_LOCKを指定せずに、このハンドルに対して別の MQGET 呼び出しを発行する。 呼び出しがMQCC_OKまたはMQCC_WARNINGで完了すると、ロックは解除されます。 呼び出しがMQCC_FAILEDで完了すると、メッセージはロックされたままになります。 ただし、次のような例外があります。MQCC_WARNINGがMQRC_TRUNCATED_MSG_FAILEDで返された場合、メッセージはアンロックされません。
MQGMO_UNLOCKを指定して、このハンドルに対して別の MQGET 呼び出しを発行する。- このハンドルに対して MQCLOSE 呼び出しを発行する。 アプリケーションの終了によって MQCLOSE が暗黙的に行われる可能性があります。
MQGMO_LOCKを指定するために、MQOO_BROWSE以外の特別な MQOPEN オプションは必要ありません。このオプションは、付随するブラウズ・オプションを指定するために必要です。MQGMO_LOCKは、以下のいずれかのオプションでは無効です。MQGMO_MARK_SKIP_BACKOUTMQGMO_SYNCPOINTMQGMO_SYNCPOINT_IF_PERSISTENTMQGMO_UNLOCK
- MQGMO_UNLOCK
- アンロックするメッセージは、
MQGMO_LOCKオプションを指定した MQGET 呼び出しによって事前にロックされていなければなりません。 このハンドルに対してロックされたメッセージがない場合、呼び出しはMQCC_WARNINGおよびMQRC_NO_MSG_LOCKEDで完了します。MQGMO_UNLOCKを指定した場合、MsgDesc、BufferLength、Buffer、およびDataLengthパラメーターは検査も変更もされません。Bufferにメッセージは返されません。MQGMO_UNLOCKを指定するために特別なオープン・オプションは必要ありません (ただし、最初にロック要求を発行するにはMQOO_BROWSEが必要です)。このオプションは、以下のオプション以外のオプションとは組み合わせて使用できません。MQGMO_NO_WAITMQGMO_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 呼び出しからの戻り時に変更されません。 - 変換が失敗した場合のみ、メッセージ・データは変換されずに戻されます。
MsgDescのCodedCharSetIdおよびEncodingフィールドは、変換されていないメッセージの値に設定されます。 この場合、完了コードはMQCC_WARNINGです。
キュー・マネージャーが変換を実行する形式名のリストについては、 MQMD-メッセージ記述子 で説明されている
Formatフィールドを参照してください。 - 変換が正常に行われた場合、 MsgDesc パラメーターに指定された
グループおよびセグメント・オプション
- 物理メッセージ
- 物理メッセージは、キューに入れたりキューから削除したりできる最小の情報単位です。 多くの場合、1 つの MQPUT、MQPUT1、または MQGET 呼び出しで指定または取得された情報に相当します。 すべての物理メッセージには、固有のメッセージ記述子、MQMD があります。 通常、物理メッセージは、メッセージ ID (MQMD の
MsgIdフィールド) の値が異なることによって区別されます。 ただし、キュー・マネージャーは固有の値を強制しません。 - 論理メッセージ
- 論理メッセージは、アプリケーション情報の単一ユニットです。 システムに制約がない場合には、1 つの論理メッセージが 1 つの物理メッセージになります。 論理メッセージが大きい場合、システムの制約により、1 つの論理メッセージをセグメントと呼ばれる複数の物理メッセージに分割することが必要になる場合があります。
セグメント化された論理メッセージは、同じ非ヌル・グループ ID (MQMD の
GroupIdフィールド) を持つ複数の物理メッセージで構成されます。 これらは同じメッセージ・シーケンス番号 (MQMD のMsgSeqNumberフィールド) を持っています。 セグメントは、セグメント・オフセット (MQMD のOffsetフィールド) の値が異なることによって区別されます。 セグメント・オフセットは、論理メッセージ内のデータの先頭から始まる、物理メッセージ内のデータのオフセットです。 各セグメントは 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 呼び出しの前にグループおよびセグメント情報を設定する必要はありません。 具体的には、アプリケーションが MQMD に
GroupId、MsgSeqNumber、および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(つまり、戻されるメッセージは、グループ内の最後の論理メッセージの最後のセグメントです)。
MQMF_SEGMENTフラグ付きのメッセージが MQGET 呼び出しで戻されたときです。MQMF_LAST_SEGMENTフラグを持つメッセージが返されると、論理メッセージは終了します。選択基準が指定されていない場合、後続の MQGET 呼び出しは、キュー上の最初のメッセージ・グループのメッセージを正しい順序で戻します。 次に 2 番目のメッセージ・グループのメッセージが戻されます。これは、使用できるメッセージがなくなるまで続きます。MatchOptionsフィールドに以下のオプションを 1 つ以上指定することによって、戻される特定のメッセージ・グループを選択することができます。MQMO_MATCH_MSG_IDMQMO_MATCH_CORREL_IDMQMO_MATCH_GROUP_ID
MatchOptionsフィールドを参照してください。表 2 は、 MQGET 呼び出しで戻すメッセージを検出しようとするときにキュー・マネージャーが検索するMsgId、CorrelId、GroupId、MsgSeqNumber、およびOffsetの各フィールドの値を示しています。 規則は、キューからメッセージを削除する場合にもキューに入っているメッセージをブラウズする場合にも適用されます。 この表の「どちらも」は「はい」または「いいえ」を意味します。LOG ORD- 呼び出しで
MQGMO_LOGICAL_ORDERオプションが指定されているかどうかを示します。 Cur grp- 現行のメッセージ・グループが呼び出しの前に存在するかどうかを示します。
Cur log msg- 現行の論理メッセージが呼び出しの前に存在するかどうかを示します。
- その他の列
- キュー・マネージャーが検索する値を示します。 「前の」という表現は、キュー・ハンドルに対して前のメッセージのフィールドに戻された値を示します。
表 2. 論理メッセージのグループおよびセグメントに関連した MQGET オプション 指定するオプション 呼び出しの前のグループおよび論理メッセージの状況 キュー・マネージャーが検索する値 LOG ORDCur grpCur log msgMsgIdCorrelIdGroupIdMsgSeqNumberOffsetはい いいえ いいえ 統制活動担当者 MatchOptions統制活動担当者 MatchOptions統制活動担当者 MatchOptions1 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 つの作業単位内で取得することはできません。
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_*オプションによって制御されます (これらのオプションの詳細については、 MQGMO-メッセージ取得オプション で説明されているMatchOptionsフィールドを参照してください)。この手法を用いると、システム障害が発生した後に、メッセージ・グループまたは論理メッセージを途中から再開することができます。 システムの再始動時に、アプリケーションは
GroupId、MsgSeqNumber、Offset、および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_GROUPMQRC_INCOMPLETE_MSGMQRC_INCONSISTENT_UOW
注: キューをブラウズする場合、またはブラウズ用にオープンされたが入力用ではないキューをクローズする場合、キュー・マネージャーはグループおよびセグメントの情報を検査しません。これらの場合、完了コードは常にMQCC_OK(他のエラーがないことを想定) です。
表 3. MQGET または MQCLOSE 呼び出しがグループおよびセグメント情報と整合していない場合の結果 現行の呼び出し 前の呼び出しは、 MQGMO_LOGICAL_ORDERを指定した MQGET でした。前の呼び出しは MQGMO_LOGICAL_ORDERを MQGET 指定しないMQGETで MQGMO_LOGICAL_ORDERMQCC_FAILEDMQCC_FAILEDMQGET ( MQGMO_LOGICAL_ORDERなし)MQCC_WARNINGMQCC_OK終了していないグループまたは論理メッセージを指定している MQCLOSE MQCC_WARNINGMQCC_OKメッセージおよびセグメントを論理順序でリトリーブしたいアプリケーションは、
MQGMO_LOGICAL_ORDERを指定することをお勧めします。これは、使用する最も簡単なオプションであるためです。 このオプションを指定すると、キュー・マネージャーがグループおよびセグメント情報を管理するので、アプリケーションでこの情報を管理する必要はなくなります。 ただし、特殊アプリケーションは、MQGMO_LOGICAL_ORDERオプションによって提供される制御よりも多くの制御を必要とする場合があります。これは、そのオプションを指定しないことによって行うことができます。 その後、アプリケーションは、各 MQGET 呼び出しの前に、 MQMDのMsgId、CorrelId、GroupId、MsgSeqNumber、およびOffsetフィールド、および MQGMOのMatchOptionsのMQMO_*オプションが正しく設定されていることを確認する必要があります。例えば、受信する物理メッセージがグループ内にあるか、論理メッセージのセグメント内にあるかに関係なく、それらのメッセージを転送するアプリケーションでは、
MQGMO_LOGICAL_ORDERを指定してはなりません。 送信側のキュー・マネージャーと受信側のキュー・マネージャーの間にパスが複数あるような複雑なネットワークの場合には、物理メッセージが正しくない順序で到達することがあります。MQGMO_LOGICAL_ORDERも、MQPUT 呼び出しで対応するMQPMO_LOGICAL_ORDERも指定しないことによって、転送アプリケーションは、論理順序で次の物理メッセージが到着するのを待たずに、到着するとすぐに各物理メッセージを検索して転送することができます。MQGMO_LOGICAL_ORDERは、他のどのMQGMO_*オプションとも一緒に指定できます。また、該当する状況ではさまざまなMQMO_*オプションと一緒に指定できます (前のセクションを参照してください)。
z/OSでは、このオプションは専用キューおよび共用キューでサポートされますが、キューの索引タイプは MQIT_GROUP_IDでなければなりません。 共有キューの場合、キューのマップ先の CFSTRUCT オブジェクトは CFLEVEL(3) 以上でなければなりません。- このオプションは、以下のプラットフォームのすべてのローカル・キューでサポートされています。
AIX
Linux
IBM i
Windows
- MQGMO_COMPLETE_MSG
- 完全な論理メッセージだけを MQGET 呼び出しで戻すことができます。 論理メッセージがセグメント化されていると、キュー・マネージャーはそれらのセグメントの再組み立てを行い、完全な論理メッセージをアプリケーションに戻します。論理メッセージがセグメント化されていたことは、それを受け取るアプリケーションには分かりません。注: これは、キュー・マネージャーにメッセージ・セグメントを再アセンブルさせる唯一のオプションです。 このオプションを指定しないと、キューに入っている (および MQGET 呼び出しで指定された他の選択基準を満たしている) セグメントはそれぞれ個別にアプリケーションに戻されます。 アプリケーションでセグメントを個別に受け取りたくない場合は、必ず
MQGMO_COMPLETE_MSGを指定する必要があります。このオプションを使用するには、アプリケーションが完全なメッセージを収容するのに十分な大きさのバッファーを提供するか、
MQGMO_ACCEPT_TRUNCATED_MSGオプションを指定する必要があります。キューにセグメント化されたメッセージがあり、いくつかのセグメントが欠落している場合 (ネットワーク内で遅延し、まだ到着していないことが原因である可能性があります)、
MQGMO_COMPLETE_MSGを指定すると、不完全な論理メッセージに属するセグメントを取得できなくなります。 ただし、これらのメッセージ・セグメントは引き続きCurrentQDepthキュー属性の値に寄与します。これは、CurrentQDepthがゼロより大きい場合でも、検索可能な論理メッセージが存在しない可能性があることを意味します。持続メッセージの場合、キュー・マネージャーがセグメントの再組み立てを実行できるのは、1 つの作業単位内でだけです。- MQGET 呼び出しがユーザー定義の作業単位内で実行されていれば、その作業単位が使用されます。 呼び出しが再組み立て処理中に失敗した場合、キュー・マネージャーは、再組み立て中に削除されたすべてのセグメントをキューに復元します。 ただし、このように失敗しても、作業単位は正常にコミットされます。
- 呼び出しがユーザー定義の作業単位外で実行されていて、またユーザー定義の作業単位が存在していない場合、キュー・マネージャーは、この呼び出しの間の作業単位を作成します。 呼び出しが成功すると、キュー・マネージャーは作業単位を自動的にコミットします (アプリケーションでこれを行う必要はありません)。 呼び出しが失敗すると、キュー・マネージャーは作業単位をバックアウトします。
- 呼び出しがユーザー定義の作業単位外で実行されているが、ユーザー定義の作業単位が存在している場合、キュー・マネージャーは再組み立てを実行できません。 再組み立てが必要でないメッセージでは、呼び出しが成功することもあります。 しかし、メッセージの再組み立てが必要な場合は、呼び出しは理由コード
MQRC_UOW_NOT_AVAILABLEで失敗します。
非持続メッセージの場合、キュー・マネージャーが再組み立てを実行するのに、作業単位が使用可能になっている必要はありません。
1 つのセグメントであるそれぞれの物理メッセージには、固有のメッセージ記述子があります。 単一の論理メッセージを構成するセグメントの場合、メッセージ記述子内のほとんどのフィールドは、論理メッセージ内のすべてのセグメントで同じです。通常、論理メッセージ内のセグメント間で異なるのは、
MsgId、Offset、および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_MSGがMQGMO_MSG_UNDER_CURSORまたはMQGMO_BROWSE_MSG_UNDER_CURSORとともに指定されている場合、MQMD 内のOffsetフィールドの値が 0 であるメッセージにブラウズ・カーソルを配置する必要があります。 この条件が満たされない場合、呼び出しは失敗し、理由コードMQRC_INVALID_MSG_UNDER_CURSORが戻ります。MQGMO_COMPLETE_MSGはMQGMO_ALL_SEGMENTS_AVAILABLEを暗黙指定するため、指定する必要はありません。MQGMO_COMPLETE_MSGは、MQGMO_SYNCPOINT_IF_PERSISTENT以外の任意のMQGMO_*オプション、および MQMO_MATCH_OFFSET 以外の任意のMQMO_*オプションと一緒に指定することができます。
z/OSでは、このオプションは専用キューおよび共用キューでサポートされますが、キューの索引タイプは MQIT_GROUP_ID でなければなりません。 共有キューの場合、キューのマップ先である CFSTRUCT オブジェクトは CFLEVEL(3) 以上でなければなりません。- 以下のプラットフォーム:
AIX
IBM i
Linux
Windows
- 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_AVAILABLEはMQGMO_ALL_SEGMENTS_AVAILABLEを暗黙指定するため、指定する必要はありません。MQGMO_ALL_MSGS_AVAILABLEは、他の任意のMQGMO_*オプション、および任意のMQMO_*オプションと一緒に指定することができます。
z/OSでは、このオプションは専用キューおよび共用キューでサポートされますが、キューの索引タイプは MQIT_GROUP_ID でなければなりません。 共有キューの場合、キューのマップ先である CFSTRUCT オブジェクトは CFLEVEL(3) 以上でなければなりません。- 以下のプラットフォーム:
AIX
IBM i
Linux
Windows
- 両方のオプションを指定すると、
- 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_MSGとMQGMO_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
IBM i
Linux
Windows
- 両方のオプションを指定した場合、
プロパティー・オプション
- 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_WAITにMQGMO_PROPERTIES_AS_Q_DEFを加えた値です。