MQPUT - メッセージの書き込み
MQPUT 呼び出しは、キューまたは配布リスト上に、あるいはトピックにメッセージを書き込みます。 キュー、配布リスト、またはトピックは、既にオープンされていなければなりません。
構文
MQPUT(Hconn,Hobj,MsgDesc,PutMsgOpts,BufferLength,Buffer,CompCode,Reason)
パラメーター
- Hconn
- タイプ: MQHCONN - 入力
このハンドルは、キュー・マネージャーに対する接続を表します。
Hconnの値は、先行の MQCONN または MQCONNX 呼び出しによって戻されたものです。z/OS® ( CICS® 用) アプリケーション、および IBM® i (互換モードで実行するアプリケーションの場合) では、MQCONN 呼び出しを省略することができ、Hconnに以下の値を指定します。- MQHC_DEF_HCONN
- デフォルトの接続ハンドル。
重要: まだ互換モードを使用している場合は、アプリケーションを再コンパイルし、代わりに静的バインド呼び出しを使用することを検討してください。 IBM iでの RPG アプリケーションの互換モード を参照してください。 - Hobj
- タイプ: MQHOBJ - 入力
このハンドルは、メッセージが追加されるキュー、またはメッセージがパブリッシュされるトピックを表します。
Hobjの値は、MQOO_OUTPUT オプションを指定した、前の MQOPEN 呼び出しから戻されたものです。 - MsgDesc
- タイプ: MQMD - 入出力
この構造体は、送られるメッセージの属性を記述するものであり、書き込み要求が完了した後でメッセージに関する情報を受け取ります。 詳しくは、 MQMD-メッセージ記述子 を参照してください。
アプリケーションがバージョン 1 の MQMD を提供している場合、メッセージ・データの接頭部に MQMDE 構造体を付ければ、バージョン 2 の MQMD に存在し、バージョン 1 には存在しない各フィールドの値を指定できます。 MQMD 内の Format フィールドは、MQMDE が存在することを示すため、MQFMT_MD_EXTENSION に設定しておく必要があります。 詳しくは、 MQMDE-メッセージ記述子拡張 を参照してください。
有効なメッセージ・ハンドルが MQPMO 構造体の OriginalMsgHandle または NewMsgHandle フィールドで提供されている場合、アプリケーションは MQMD 構造を提供する必要がありません。 これらのフィールドに何も提供されていない場合、メッセージの記述子は、メッセージ・ハンドルに関連した記述子から取られます。
API 出口を使用する場合、または使用する予定がある場合は、MQMD 構造体を明示的に提供して、メッセージ・ハンドルに関連付けられているメッセージ記述子を使用しないことをお勧めします。 これは、MQPUT 呼び出しまたは MQPUT1 呼び出しに関連付けられている API 出口では、キュー・マネージャーが MQPUT 要求または MQPUT1 要求を完了するために使用する MQMD 値を確認できないためです。
- PutMsgOpts
- タイプ: MQPMO - 入出力
詳しくは、 MQPMO-メッセージ書き込みオプション を参照してください。
- BufferLength
- タイプ: MQLONG - 入力
Buffer内のメッセージの長さ。 ゼロは有効であり、メッセージにアプリケーション・データが含まれていないことを示します。BufferLengthの上限は様々な要因によって異なります。- 宛先がローカル・キューであるか、またはローカル・キューに解決される場合、上限は以下の条件を満たすかどうかによって異なります。
- ローカル・キュー・マネージャーがセグメント化をサポートしている。
- 送信側アプリケーションが、キュー・マネージャーでメッセージのセグメント化を可能にするフラグを指定している。 このフラグは MQMF_SEGMENTATION_ALLOWED であり、バージョン 2 の MQMD 内で指定できるほか、バージョン 1 の MQMD を使用する場合は MQMDE 内で指定できます。
BufferLengthは 999 999 999 から MQMD 内のOffsetフィールドの値を引いた値を超えることはできません。 したがって、書き込むことのできる最長の論理メッセージは、999 999 999 バイト (Offsetがゼロの場合) になります。 ただし、オペレーティング・システムによって、またはアプリケーションが実行されている環境によってリソースが制約される結果、上限がこれよりさらに小さい値になる場合があります。上記の条件のいずれか一方または両方が満たされない場合、
BufferLengthは、キューのMaxMsgLength属性とキュー・マネージャーのMaxMsgLength属性のうち小さい方の値以下でなければなりません。 - 宛先がリモート・キューの場合や宛先の解決先がリモート・キューである場合も、ローカル・キューの条件が適用されます。ただし、メッセージが宛先キューに到達するまでに通過するすべてのキュー・マネージャーが適用の対象となります。特に、次のキューに注意してください。
- ローカル・キュー・マネージャーで一時的にメッセージを保管するために使用されるローカル伝送キュー。
- ローカルのキュー・マネージャーと宛先のキュー・マネージャーとの間の経路にあるキュー・マネージャーで、メッセージを保管するために使用される中間伝送キュー (それがある場合)。
- 宛先キュー・マネージャーでの宛先キュー。
メッセージが伝送キューに入れられる場合は、メッセージ・データと共に追加情報があるため、転送できるアプリケーション・データの量は小さくなります。 この状況では、
BufferLengthの制限を決定するときに、伝送キューのMaxMsgLength値から MQ_MSG_HEADER_LENGTH バイトを減算します。注: メッセージが書き込まれるときに同期的に診断できるのは、条件 1 に準拠していない場合のみです (理由コード MQRC_MSG_TOO_BIG_FOR_Q または MQRC_MSG_TOO_BIG_FOR_Q_MGR)。 条件 2 または 3 が満たされない場合、メッセージは、中間キュー・マネージャーまたは宛先キュー・マネージャーのいずれかの箇所で送達不能 (未配布メッセージ) キューにリダイレクトされます。 これが発生した場合、送信側からの要求があれば、レポート・メッセージが生成されます。
- 宛先がローカル・キューであるか、またはローカル・キューに解決される場合、上限は以下の条件を満たすかどうかによって異なります。
- BUFFER
- タイプ: MQBYTExBufferLength - 入力
これは、送信するアプリケーション・データが入っているバッファーです。 バッファーは、メッセージのデータの性質に適した境界に位置合わせされなければなりません。 ほとんどのメッセージ ( IBM MQ ヘッダー構造体を含むメッセージを含む) には 4 バイトの位置合わせが適していますが、メッセージによっては、より厳しい位置合わせを必要とする場合があります。 例えば、64 ビット・バイナリー整数を 含むメッセージは 8 バイト境界に合わせる必要がある場合があります。
Bufferに文字データまたは数値データが含まれている場合は、MsgDescパラメーターのCodedCharSetIdフィールドおよびEncodingフィールドを、データに適した値に設定します。これにより、メッセージの受信側は、必要に応じて、データを受信側が使用する文字セットおよびエンコードに変換することができます。注: MQPUT 呼び出しの他のパラメーターはすべて、ローカル・キュー・マネージャーの文字セットとエンコードになっていなければなりません (CodedCharSetIdキュー・マネージャー属性と MQENC_NATIVE で指定します)。C プログラミング言語では、パラメーターは、void を示すポインターとして宣言されます。 つまり、どのタイプのデータのアドレスもパラメーターとして指定できます。
BufferLengthパラメーターがゼロの場合は、Bufferは参照されません。この場合は、C または System/390 アセンブラー言語で作成されたプログラムによって渡されるパラメーター・アドレスがヌルになる可能性があります。 - CompCode
- タイプ: MQLONG - 出力完了コード。以下のいずれかです。
- MQCC_OK
- 正常終了。
- MQCC_WARNING
- 警告 (部分完了)。
- MQCC_FAILED
- 呼び出し失敗。
- 理由 (Reason)
- タイプ: MQLONG - 出力
CompCodeを限定する理由コード。CompCodeが MQCC_OK の場合:- MQRC_NONE
- (0, X'000') レポートする理由コードはありません。
CompCodeが MQCC_WARNING の場合:- MQRC_INCOMPLETE_GROUP
- (2241, X'8C1') メッセージ・グループが不完全である。
- MQRC_INCOMPLETE_MSG
- (2242, X'8C2') 論理メッセージが不完全である。
- MQRC_INCONSISTENT_PERSISTENCE
- (2185, X'889') 持続性の指定が不整合である。
- MQRC_INCONSISTENT_UOW
- (2245, X'8C5') 作業単位の指定が不整合である。
- MQRC_MULTIPLE_REASONS
- (2136, X'858') 複数の理由コードが返されました。
- MQRC_PRIORITY_EXCEEDS_MAXIMUM
- (2049, X'801') メッセージ優先順位が、サポートされる最大値を超えている。
- MQRC_UNKNOWN_REPORT_OPTION
- (2104, X'838') メッセージ記述子のレポート・オプション (1 つまたは複数) が認識されない。
CompCodeが MQCC_FAILED の場合:- MQRC_ADAPTER_NOT_AVAILABLE
- (2204, X'89C') アダプターが利用できません。
- MQRC_ADAPTER_SERV_LOAD_ERROR
- (2130, X'852') アダプター・サービス・モジュールをロードできません。
- MQRC_ALIAS_TARGTYPE_CHANGED
- (2480, X'09B0') サブスクリプションのターゲット・タイプがキューからトピック・オブジェクトに変更された。
- MQRC_API_EXIT_ERROR
- (2374, X'946') API 出口で障害が発生しました。
- MQRC_API_EXIT_LOAD_ERROR
- (2183, X'887') API 出口をロードできません。
- MQRC_ASID_MISMATCH
- (2157, X'86D') 1 次 ASID とホーム ASID が異なっています。
- MQRC_BACKED_OUT
- (2003, X'7D3') 作業単位がバックアウトされた。
- MQRC_BUFFER_ERROR
- (2004, X'7D4') バッファー・パラメーターが無効である。
- MQRC_BUFFER_LENGTH_ERROR
- (2005, X'7D5') バッファー長パラメーターは無効です。
- MQRC_CALL_IN_PROGRESS
- (2219, X'8AB') 前の呼び出しが完了する前に MQI 呼び出しが入力されました。
- MQRC_CALL_INTERRUPTED
- (2549, X'9F5') MQPUT または MQCMIT が中断されたため、再接続処理で確実な成果を再び得ることができない。
- MQRC_CF_NOT_AVAILABLE
- (2345, X'929') カップリング・ファシリティーが使用できません。
- MQRC_CF_STRUC_FAILED
- (2373, X'945') カップリング・ファシリティー構造体で障害が発生しました。
- MQRC_CF_STRUC_IN_USE
- (2346, X'92A') カップリング・ファシリティー構造体が使用中です。
- MQRC_CFGR_ERROR
- (2416, X'970') メッセージ・データ内の PCF グループ・パラメーター構造 MQCFGR が無効である。
- MQRC_CFH_ERROR
- (2235, X'8BB') PCF ヘッダー構造体が無効である。
- MQRC_CFIF_ERROR
- (2414, X'96E') メッセージ・データ内の PCF 整数フィルターのパラメーター構造が無効である。
- MQRC_CFIL_ERROR
- (2236, X'8BC') PCF 整数リスト・パラメーター構造または PCIF*64 整数リスト・パラメーター構造が無効である。
- MQRC_CFIN_ERROR
- (2237, X'8BD') PCF 整数のパラメーター構造体または PCIF*64 整数のパラメーター構造が無効である。
- MQRC_CFSF_ERROR
- (2415, X'96F') メッセージ・データ内の PCF ストリング・フィルターのパラメーター構造が無効である。
- MQRC_CFSL_ERROR
- (2238, X'8BE') PCF ストリング・リストのパラメーター構造体が無効である。
- MQRC_CFST_ERROR
- (2239, X'8BF') PCF ストリングのパラメーター構造体が無効である。
- MQRC_CICS_WAIT_FAILED (MQRC_ WAIT_FAILED)
- (2140, X'85C') 待機要求が CICS によって拒否されました。
- MQRC_CLUSTER_EXIT_ERROR
- (2266, X'8DA') クラスター・ワークロード出口で障害が発生しました。
- MQRC_CLUSTER_RESOLUTION_ERROR
- (2189, X'88D') クラスター名の解決に失敗しました。
- MQRC_CLUSTER_RESOURCE_ERROR
- (2269, X'8DD') クラスター・リソース・エラー。
- MQRC_COD_NOT_VALID_FOR_XCF_Q
- (2106, X'83A') COD レポート・オプションが XCF キューについて無効である。
- MQRC_CONNECTION_BROKEN
- (2009, X'7D9') キュー・マネージャーとの接続が失われました。
- MQRC_CONNECTION_NOT_AUTHORIZED
- (2217, X'8A9') 接続が許可されていません。
- MQRC_CONNECTION_QUIESCING
- (2202, X'89A') 接続が静止しています。
- MQRC_CONNECTION_STOPPING
- (2203, X'89B') 接続がシャットダウン中です。
- MQRC_CONTENT_ERROR
- 2554 (X'09FA') メッセージの内容を解析することで、拡張メッセージ・セレクターを使用してメッセージをサブスクライバーに送信する必要があるかどうかを判別できなかった。
- MQRC_CONTEXT_HANDLE_ERROR
- (2097, X'831') 参照されたキュー・ハンドルがコンテキストを保存しない。
- MQRC_CONTEXT_NOT_AVAILABLE
- (2098, X'832') 参照されたキュー・ハンドルでコンテキストが使用できない。
- MQRC_DATA_LENGTH_ERROR
- (2010, X'7DA') データ長パラメーターが無効である。
- MQRC_DH_ERROR
- (2135, X'857') 配布ヘッダー構造体が無効である。
- MQRC_DLH_ERROR
- (2141, X'85D') 送達不能ヘッダー構造体が無効である。
- MQRC_EPH_ERROR
- (2420, X'974') 組み込み PCF 構造が無効である。
- MQRC_EXPIRY_ERROR
- (2013, X'7DD') 満了時刻が無効である。
- MQRC_FEEDBACK_ERROR
- (2014, X'7DE') フィードバック・コードが無効である。
- MQRC_GLOBAL_UOW_CONFLICT
- (2351, X'92F') グローバル作業単位に矛盾がある。
- MQRC_GROUP_ID_ERROR
- (2258, X'8D2') グループ ID が無効である。
- MQRC_HANDLE_IN_USE_FOR_UOW
- (2353, X'931') グローバル作業単位のためのハンドルが使用中。
- MQRC_HCONN_ERROR
- (2018, X'7E2') 接続ハンドルが無効です。
- MQRC_HEADER_ERROR
- (2142, X'85E') MQ ヘッダー構造体が無効である。
- MQRC_HOBJ_ERROR
- (2019, X'7E3') オブジェクト・ハンドルが無効です。
- MQRC_IIH_ERROR
- (2148, X'864') IMS 情報ヘッダー構造体が無効である。
- MQRC_INCOMPLETE_GROUP
- (2241, X'8C1') メッセージ・グループが不完全である。
- MQRC_INCOMPLETE_MSG
- (2242, X'8C2') 論理メッセージが不完全である。
- MQRC_INCONSISTENT_PERSISTENCE
- (2185, X'889') 持続性の指定が不整合である。
- MQRC_INCONSISTENT_UOW
- (2245, X'8C5') 作業単位の指定が不整合である。
- MQRC_LOCAL_UOW_CONFLICT
- (2352, X'930') グローバル作業単位とローカル作業単位に矛盾がある。
- MQRC_MD_ERROR
- (2026, X'7EA') メッセージ記述子が無効である。
- MQRC_MDE_ERROR
- (2248, X'8C8') メッセージ記述子の拡張子が無効である。
- MQRC_MISSING_REPLY_TO_Q
- (2027, X'7EB') 応答先キューがないか、または MQPMO_SUPPRESS_REPLYTO が使用されている。
- MQRC_MISSING_WIH
- (2332, X'91C') メッセージ・データが MQWIH で始まっていない。
- MQRC_MSG_FLAGS_ERROR
- (2249, X'8C9') メッセージ・フラグが無効である。
- MQRC_MSG_SEQ_NUMBER_ERROR
- (2250, X'8CA') メッセージ順序番号が無効である。
- MQRC_MSG_TOO_BIG_FOR_Q
- (2030, X'7EE') メッセージの長さが、キューの最大許容数より大きいです。
- MQRC_MSG_TOO_BIG_FOR_Q_MGR
- (2031, X'7EF') メッセージ長がキュー・マネージャーの最大許容長より大きいです。
- MQRC_MSG_TYPE_ERROR
- (2029, X'7ED') メッセージ記述子のメッセージ・タイプが無効である。
- MQRC_MULTIPLE_REASONS
- (2136, X'858') 複数の理由コードが返されました。
- MQRC_NO_DESTINATIONS_AVAILABLE
- (2270, X'8DE') 使用可能な宛先キューがない。
- MQRC_NOT_OPEN_FOR_OUTPUT
- (2039, X'7F7') キューが出力用にオープンされていない。
- MQRC_NOT_OPEN_FOR_PASS_ALL
- (2093, X'82D') キューが全コンテキスト・パスとしてオープンされていない。
- MQRC_NOT_OPEN_FOR_PASS_IDENT
- (2094, X'82E') キューが識別コンテキスト・パスとしてオープンされていない。
- MQRC_NOT_OPEN_FOR_SET_ALL
- (2095, X'82F') キューが全コンテキスト設定用にオープンされていない。
- MQRC_NOT_OPEN_FOR_SET_IDENT
- (2096, X'830') キューが識別コンテキスト設定用にオープンされていない。
- MQRC_OBJECT_CHANGED
- (2041, X'7F9') オープンされた後でオブジェクト定義が変更された。
- MQRC_OBJECT_DAMAGED
- (2101, X'835') オブジェクトが損傷しました。
- MQRC_OFFSET_ERROR
- (2251, X'8CB') メッセージ・セグメント・オフセットが無効である。
- MQRC_OPEN_FAILED
- (2137, X'859') オブジェクトが正常にオープンされていません。
- MQRC_OPTIONS_ERROR
- (2046, X'7FE') オプションが無効であるか、矛盾しています。
- MQRC_ORIGINAL_LENGTH_ERROR
- (2252, X'8CC') 元の長さが無効である。
- MQRC_PAGESET_ERROR
- (2193, X'891') ページ・セット・データ・セットへのアクセス中にエラーが発生しました。
- MQRC_PAGESET_FULL
- (2192, X'890') 外部ストレージ・メディアが満杯です。
- MQRC_PCF_ERROR
- (2149, X'865') PCF 構造体が無効である。
- MQRC_PERSISTENCE_ERROR
- (2047, X'7FF') 持続性が無効である。
- MQRC_PERSISTENT_NOT_ALLOWED
- (2048, X'800') キューは永続的なメッセージをサポートしていません。
- MQRC_PMO_ERROR
- (2173, X'87D') 書き込みメッセージ・オプションの構造体が無効である。
- MQRC_PMO_RECORD_FLAGS_ERROR
- (2158, X'86E') 書き込みメッセージ・レコード・フラグが無効である。
- MQRC_PRIORITY_ERROR
- (2050, X'802') メッセージ優先順位が無効である。
- MQRC_PUBLICATION_FAILURE
- (2502, X'9C6') パブリケーションはどのサブスクライバーにも送達されていない。
- MQRC_PUT_INHIBITED
- (2051, X'803') 書き込み呼び出しがこのキュー、このキューが解決されるキュー、またはトピックについて使用禁止になっている。
- MQRC_PUT_MSG_RECORDS_ERROR
- (2159, X'86F') 書き込みメッセージ・レコードが無効である。
- MQRC_PUT_NOT_RETAINED
- (2479, X'09AF') パブリケーションを保存できなかった。
- MQRC_Q_DELETED
- (2052, X'804') キューが削除されました。
- MQRC_Q_FULL
- (2053, X'805') キューには既に最大数のメッセージが入っています。
- MQRC_Q_MGR_NAME_ERROR
- (2058, X'80A') キュー・マネージャー名が無効であるか、認識されていません。
- MQRC_Q_MGR_NOT_AVAILABLE
- (2059, X'80B') キュー・マネージャーを接続に使用できません。
- MQRC_Q_MGR_QUIESCING
- (2161, X'871') キュー・マネージャーが静止しています。
- MQRC_Q_MGR_STOPPING
- (2162, X'872') キュー・マネージャーのシャットダウン中です。
- MQRC_Q_SPACE_NOT_AVAILABLE
- (2056, X'808') ディスク上にキューのためのスペースがありません。
- MQRC_RECONNECT_FAILED
- (2548, X'9F4') 再接続後、再接続可能な接続のハンドルの復元中にエラーが発生した。
- MQRC_RECS_PRESENT_ERROR
- (2154, X'86A') 存在するレコード数が無効です。
- MQRC_REPORT_OPTIONS_ERROR
- (2061, X'80D') メッセージ記述子のレポート・オプションが無効である。
- MQRC_RESOURCE_PROBLEM
- (2102, X'836') 使用できるシステム・リソースが不足しています。
- MQRC_RESPONSE_RECORDS_ERROR
- (2156, X'86C') 応答レコードが無効です。
- MQRC_RFH_ERROR
- (2334, X'91E') MQRFH または MQRFH2 構造体が無効である。
- MQRC_RMH_ERROR
- (2220, X'8AC') 参照メッセージ・ヘッダー構造体が無効である。
- MQRC_SEGMENT_LENGTH_ZERO
- (2253, X'8CD') メッセージ・セグメント内のデータの長さがゼロである。
- MQRC_SEGMENTS_NOT_SUPPORTED
- (2365, X'93D') セグメントがサポートされていない。
- MQRC_SELECTION_NOT_AVAILABLE
- 2551 (X'09F7') パブリケーションに可能なサブスクライバーが存在しますが、キュー・マネージャーはパブリケーションをサブスクライバーに送信するかどうかを確認できません。
- MQRC_STOPPED_BY_CLUSTER_EXIT
- (2188, X'88C') クラスター・ワークロード出口によって呼び出しが拒否されました。
- MQRC_STORAGE_CLASS_ERROR
- (2105, X'839') ストレージ・クラス・エラー。
- MQRC_STORAGE_MEDIUM_FULL
- (2192, X'890') 外部ストレージ・メディアが満杯です。
- MQRC_STORAGE_NOT_AVAILABLE
- (2071, X'817') ストレージが不足しています。
- MQRC_SUPPRESSED_BY_EXIT
- (2109, X'83D') 出口プログラムにより呼び出しが抑止されました。
- MQRC_SYNCPOINT_LIMIT_REACHED
- (2024, X'7E8') 現行の作業単位内では、これ以上メッセージを処理できない。
- MQRC_SYNCPOINT_NOT_AVAILABLE
- (2072, X'818') 同期点サポートが利用できない。
- MQRC_TM_ERROR
- (2265, X'8D9') トリガー・メッセージ構造体が無効である。
- MQRC_TMC_ERROR
- (2191, X'88F') 文字トリガー・メッセージ構造体が無効である。
- MQRC_UNEXPECTED_ERROR
- (2195, X'893') 予期しないエラーが発生しました。
- MQRC_UOW_ENLISTMENT_ERROR
- (2354, X'932') グローバル作業単位の参加に失敗した。
- MQRC_UOW_MIX_NOT_SUPPORTED
- (2355, X'933') 作業単位呼び出しの混合はサポートされていない。
- MQRC_UOW_NOT_AVAILABLE
- (2255, X'8CF') 作業単位がキュー・マネージャーから使用不可。
- MQRC_WIH_ERROR
- (2333, X'91D') MQWIH 構造体が無効である。
- MQRC_WRONG_MD_VERSION
- (2257, X'8D1') 提供された MQMD のバージョンが違っている。
- MQRC_XQH_ERROR
- (2260, X'8D4') 伝送キュー・ヘッダー構造体が無効である。
これらのコードについて詳しくは、 メッセージおよび理由コードを参照してください。
トピックの使用上の注意
- 以下の注意事項は、トピックの使用に適用されます。
- MQPUT を使用してトピックでメッセージをパブリッシュする場合、サブスクライバー・キューで問題が発生した (例えば、キューが満杯である) ために、そのトピックの 1 つ以上のサブスクライバーにパブリケーションを提供できない場合、MQPUT 呼び出しに戻される理由コードおよび配信時の振る舞いは、TOPIC での PMSGDLV または NPMSGDLV 属性の設定によって異なります。 MQRO_DEAD_LETTER_Q が指定されているときに送達不能キューにパブリケーションが配信された場合、または MQRO_DISCARD_MSG が指定されているときにメッセージが廃棄された場合、メッセージは正常に送信されたと見なされることに注意してください。 どのパブリケーションも送達されなかった場合、MQPUT は MQRC_PUBLICATION_FAILURE で戻ります。 これは次の場合に起こります。
- PMSGDLV または NPMSGDLV (メッセージの持続性によって異なる) が ALL に設定されている TOPIC にメッセージがパブリッシュされ、いずれかのサブスクリプション (永続的かどうかにかかわらず) にパブリケーションを受け取ることができないキューがある。
- メッセージが PMSGDLV または NPMSGDLV (メッセージのパーシスタンスによって異なる) が ALLDUR に設定されている TOPIC にパブリッシュされており、永続サブスクリプションにパブリケーションを受信できないキューが含まれている。
- PMSGDLV または NPMSGDLV (メッセージの持続性によって異なる) が ALLAVAIL に設定されている TOPIC にメッセージがパブリッシュされ、いずれかのサブスクリプション (永続的かどうかにかかわらず) にパブリケーションを受け取ることができないキューがある。
- PMSGDLV または NPMSGDLV (メッセージの持続性によって異なる) が ALLDUR に設定されている TOPIC にメッセージがパブリッシュされ、非永続サブスクリプションにパブリケーションを受け取ることができないキューがある。
- 使用されているトピックに対するサブスクライバーが存在しない場合、パブリッシュされるメッセージはどのキューにも送信されずに廃棄されます。 メッセージが持続または非持続であるか、あるいはその有効期限が無制限かまたは有効期限が設定されているかは関係ありません。サブスクライバーが存在しない場合は、メッセージは常に廃棄されます。 このことの例外となるのは、メッセージが保存される場合です。この場合、メッセージはどのサブスクライバーのキューにも送信されませんが、メッセージはトピックに対して保管され、新規サブスクリプションに対して、または MQSUBRQ を使用して保存パブリケーションを要求するサブスクライバーに対して送達されます。
- MQPUT を使用してトピックでメッセージをパブリッシュする場合、サブスクライバー・キューで問題が発生した (例えば、キューが満杯である) ために、そのトピックの 1 つ以上のサブスクライバーにパブリケーションを提供できない場合、MQPUT 呼び出しに戻される理由コードおよび配信時の振る舞いは、TOPIC での PMSGDLV または NPMSGDLV 属性の設定によって異なります。 MQRO_DEAD_LETTER_Q が指定されているときに送達不能キューにパブリケーションが配信された場合、または MQRO_DISCARD_MSG が指定されているときにメッセージが廃棄された場合、メッセージは正常に送信されたと見なされることに注意してください。 どのパブリケーションも送達されなかった場合、MQPUT は MQRC_PUBLICATION_FAILURE で戻ります。 これは次の場合に起こります。
MQPUT および MQPUT1
MQPUT および MQPUT1 呼び出しを使用して、メッセージをキューに書き込むことができます。どの呼び出しが使用されるかは状況に応じて異なります。
- 同じキュー上に複数のメッセージを配置する場合は MQPUT 呼び出しを使用します。
MQOO_OUTPUT オプションを指定する MQOPEN 呼び出しが最初に発行され、その後に 1 つまたは複数の MQPUT 要求が続き、キューにメッセージを追加します。最後に、キューは MQCLOSE 呼び出しでクローズされます。 この結果、MQPUT1 呼び出しを繰り返して使用するよりもパフォーマンスが向上します。
- キュー上に 1 つのメッセージのみを書き込むには MQPUT1 呼び出しを使用します。
この呼び出しは、MQOPEN、MQPUT、および MQCLOSE 呼び出しをまとめて単一の呼び出しにカプセル化するので、発行する必要がある呼び出しの数は最小になります。
宛先キュー
- アプリケーションがメッセージ・グループを使用せずに同じキューに一連のメッセージを書き込んだ場合、詳細な条件が満たされると、それらのメッセージの順序が保持されます。 ローカル宛先キューとリモート宛先キューの両方に適用される条件と、リモート宛先キューだけに適用される条件とがあります。ローカル宛先キューおよびリモート宛先キューに適用される条件
- すべての MQPUT 呼び出しが同一作業単位内に含まれている、または作業単位内にまったく含まれていない。
メッセージが 1 つの作業単位内の特定のキューに書き込まれると、他のアプリケーションからのメッセージに、そのキューのメッセージ・シーケンスが散在することがあることに注意してください。
- すべての MQPUT 呼び出しは、同じオブジェクト・ハンドル
Hobjを使用して実行される。環境によっては、異なるオブジェクト・ハンドルを使用してもメッセージ順序が保持されることがあります。ただし、呼び出しが同じアプリケーションから実行される場合に限ります。 同じアプリケーション の意味は、環境によって決まります。- z/OS では、アプリケーションは次のとおりです。
- CICS の場合、CICS タスク。
- IMS の場合、タスク。
- z/OS バッチの場合、タスク。
- IBM iでは、アプリケーションがジョブです。
- Windows および UNIX システムでは、アプリケーションはスレッドです。
- z/OS では、アプリケーションは次のとおりです。
- どのメッセージも同じ優先順位をもっている。
- メッセージが、MQOO_BIND_NOT_FIXED が指定されたクラスター・キュー (DefBind キュー属性の値が MQBND_BIND_NOT_FIXED のときは MQOO_BIND_AS_Q_DEF が有効なクラスター・キュー) に書き込まれていない。
リモート宛先キューに適用される追加条件- 送信側のキュー・マネージャーから宛先キュー・マネージャーへのパスが 1 つしかない。
シーケンス内の一部のメッセージが別のパスを使用する可能性がある場合 (例えば、再構成のため、またはトラフィックのバランスのため、あるいはメッセージ・サイズに基づくパス選択のために) は、宛先キュー・マネージャーでのメッセージの順番は保証できません。
- 送信側、中間、または宛先キュー・マネージャーで、メッセージが一時的に送達不能キューに置かれません。
1 つ以上のメッセージが一時的に送達不能キューに置かれる場合 (例えば、伝送キューまたは宛先キューが一時的に満杯であるために)、メッセージが宛先キューに順序どおりに到達しない可能性があります。
- メッセージがすべて持続メッセージか、あるいはすべて非持続メッセージかのいずれかである。
送信側キュー・マネージャーと宛先キュー・マネージャーの間の経路上のチャネルの
NonPersistentMsgSpeed属性が MQNPMS_FAST に設定されている場合、非持続メッセージは持続メッセージの前にジャンプする可能性があり、その結果、非持続メッセージに対する持続メッセージの相対順序が保持されなくなります。 ただし、持続メッセージ同士および非持続メッセージ同士の相対的順序は保持されます。
これらの条件が満たされない場合、メッセージ・グループを使用して、メッセージの順序を保持することができます。ただし、これには、送信側のアプリケーションと受信側のアプリケーションの両方が メッセージ・グループ化サポートを使用している必要があります。 メッセージ・グループの詳細については、以下を参照してください。 - すべての MQPUT 呼び出しが同一作業単位内に含まれている、または作業単位内にまったく含まれていない。
配布リスト
次の注意事項は、配布リストの使用に適用されます。
- バージョン 1 の MQPMO またはバージョン 2 の MQPMO を使用して、各メッセージを配布リストに書き込むことができます。 バージョン 1 の MQPMO が使用される (または
RecsPresentがゼロに等しいバージョン 2 の MQPMO が使用される) 場合には、書き込みメッセージ・レコードも応答レコードもアプリケーションにより提供されません。 メッセージが配布リスト内のいくつかのキューに正常に送信され、それ以外のキューには正常に送信されない場合、エラーが発生したキューを識別することはできません。書き込みメッセージ・レコードまたは応答レコードがアプリケーションにより提供される場合には、
Versionフィールドを、MQPMO_VERSION_2 に設定します。バージョン 2 の MQPMO でも、
RecsPresentをゼロにすると、配布リストにない単一キューにメッセージを送信することができます。 - 完了コード・パラメーターおよび理由コード・パラメーターは、次のように設定されます。
- 配布リスト内のキューへの書き込みがすべて同様に成功または失敗すると、完了コードおよび理由コード・パラメーターがその共通の結果を説明するよう設定されます。 MQRR 応答レコード (アプリケーションにより提供されている場合) は、この場合には設定されません。
例えば、すべての書き込みが成功すると、完了コードおよび理由コードは、MQCC_OK および MQRC_NONE に設定されます。すべてのキューが書き込み用に使用禁止になっているため失敗したときは、パラメーターはそれぞれ MQCC_FAILED および MQRC_PUT_INHIBITED に設定されます。
- 配布リスト内のキューに対する書き込みが一部成功した場合または失敗したがその理由が異なる場合は、次のように設定されます。
- 少なくとも 1 つの書き込みが成功した場合、完了コード・パラメーターは MQCC_WARNING に、そしてすべてが失敗した場合には、MQCC_FAILED に設定されます。
- 理由コード・パラメーターは、MQRC_MULTIPLE_REASONS に設定されます。
- 応答レコード (アプリケーションにより提供されている場合) は、配布リスト内のキューごとに、個別の完了コードおよび理由コードに設定されます。
宛先への書き込みが、その宛先のオープンが失敗したために、失敗した場合、応答レコード内の各フィールドは、MQCC_FAILED および MQRC_OPEN_FAILED に設定されます。その宛先は、
InvalidDestCountに組み込まれます。
- 配布リスト内のキューへの書き込みがすべて同様に成功または失敗すると、完了コードおよび理由コード・パラメーターがその共通の結果を説明するよう設定されます。 MQRR 応答レコード (アプリケーションにより提供されている場合) は、この場合には設定されません。
- 配布リストに指定した宛先のいずれかの解決先がローカル・キューである場合、メッセージは通常形式で (つまり、配布リスト・メッセージとしてではなく) そのキューに登録されます。 複数の宛先の解決先が同じローカル・キューである場合は、このローカル・キューには同じメッセージが宛先数分登録されます。
配布リストに指定した宛先がリモート・キューに解決された場合、メッセージは、適切な伝送キュー上に登録されます。 いくつかの宛先の解決結果が同じ伝送キューである場合、アプリケーションによって提供される宛先リストの中でそれらの宛先が隣接していない場合でも、これらの宛先を含む単一の配布リスト・メッセージが伝送キューに入れられることがあります。 ただし、これを行うことができるのは、伝送キューが配布リスト・メッセージをサポートしている場合だけです ( DistLists を参照してください)。
伝送キューが配布リストをサポートしていない場合、通常形式のメッセージのコピーが、その伝送キューを使用する各宛先の伝送キュー上に配置されます。
アプリケーション・メッセージ・データをもつ配布リストが伝送キューに対して大きすぎる場合、配布リスト・メッセージは、包含する宛先数の少ない小さな配布リスト・メッセージに分割されます。 アプリケーション・メッセージ・データのみがキューに保管される場合、配布リスト・メッセージはまったく使用できず、キュー・マネージャーは、その伝送キューを使用する各宛先用にそのメッセージのコピーを通常形式で生成します。
それぞれの宛先が異なるメッセージ優先順位またはメッセージ持続性を持つ場合 (アプリケーションで MQPRI_PRIORITY_AS_Q_DEF または MQPER_PERSISTENCE_AS_Q_DEF を指定すると、このようなことが起こります) は、メッセージが同じ配布リスト・メッセージ内に保持されません。 そのため、キュー・マネージャーは、異なる優先順位および持続性値を収容するのに必要な数の配布リスト・メッセージを生成します。
- 配布リストへメッセージを書き込むと、メッセージは次のいずれかになる場合があります。
- 1 つの配布リスト・メッセージ
- いくつかの小さな配布リスト・メッセージ
- 配布リスト・メッセージと通常メッセージが混在するメッセージ
- 通常メッセージだけ
- リスト内の各宛先がローカル、リモート、またはローカルおよびリモートのいずれであるか。
- 各宛先が同じメッセージ優先順位およびメッセージ持続性を有するかどうか。
- 伝送キューが配布リスト・メッセージを保持できるかどうか。
- 伝送キューの最大メッセージ長が、配布リスト形式でそのメッセージを保管できる長さであるかどうか。
- アプリケーションが 1 つの作業単位で許可される最大メッセージ数を超えたかどうかを検査する (
MaxUncommittedMsgsキュー・マネージャー属性を参照)。 - トリガー発行条件が満たされているかどうかを検査するとき。
- キューのサイズを増加させ、各キューの最大サイズが超過するかどうかを検査するとき。
- 各キューを個々にオープンするとハンドルが無効になるようなキュー定義の変更 (例えば、解決パスの変更) があっても、配布リスト・ハンドルは無効にはなりません。 しかし、後続の MQPUT 呼び出しで配布リスト・ハンドルが使用される際、その特定のキューについては失敗します。
ヘッダー
アプリケーション・メッセージ・データの先頭に 1 つ以上の IBM MQ ヘッダー構造体を持つメッセージが書き込まれると、キュー・マネージャーはヘッダー構造体に対して特定の検査を実行して、それらが有効であることを確認します。 キュー・マネージャーがエラーを検出すると、呼び出しは失敗し、該当する理由コードが戻ります。 実行される検査は、存在する特定の構造体によって異なります。
- バージョン 2 以降の MQMD が MQPUT または MQPUT1 呼び出し内で使用される場合にだけ、検査が実行されます。 メッセージ・データの開始時点で MQMDE が存在していても、バージョン 1 の MQMD が使用されている場合には、これらの検査は実行されません。
- ローカル・キュー・マネージャーによってサポートされない構造体、およびメッセージ内の最初の MQDLH の後の構造体には、妥当性検査は行われません。
- MQDH および MQMDE 構造体の妥当性は、キュー・マネージャーによって完全に検証されます。
- 他の構造体の妥当性は、キュー・マネージャーによって部分的に検証されます (すべてのフィールドが検査されるわけではありません)。
StrucIdフィールドが有効でなければならない。Versionフィールドが有効でなければならない。StrucLengthフィールドには、構造体と、その構造体の一部を形成するすべての可変長データが入るだけの十分な大きさの値が指定されなければならない。CodedCharSetIdフィールドは、ゼロまたは無効な負の値であってはなりません (MQCCSI_DEFAULT、MQCCSI_EMBEDDED、MQCCSI_Q_MGR、および MQCCSI_UNDEFINED は、ほとんどの IBM MQ ヘッダー構造体では 無効です )。- 呼び出しの
BufferLengthパラメーターには、構造体 (構造体はメッセージの長さよりも長くなってはならない) が入るだけの大きさを持つ値が指定されなければならない。
- PCF メッセージ内の構造体の長さの合計は、MQPUT または MQPUT1 呼び出しの
BufferLengthパラメーターで指定された長さと等しくなければなりません。 PCF メッセージとは、MQFMT_ADMIN、MQFMT_EVENT、または MQFMT_PCF の形式名を持つメッセージのことです。 - IBM MQ 構造体は、切り捨てられた構造体が許可される以下の状況を除き、切り捨ててはなりません。
- レポート・メッセージであるメッセージ
- PCF メッセージ。
- MQDLH 構造体を含む各メッセージ (最初の MQDLH の後ろの 構造体は、切り捨て可能です。この MQDLH の前にある構造体は、切り捨てできません。)
- IBM MQ 構造は、複数のセグメントに分割してはなりません。この構造は、全体が 1 つのセグメント内に含まれている必要があります。
Buffer
Visual Basic プログラミング言語には、以下の点が適用されます。
BufferパラメーターのサイズがBufferLengthパラメーターで指定された長さより小さい場合、呼び出しは失敗し、理由コード MQRC_BUFFER_LENGTH_ERROR が戻ります。BufferパラメーターはタイプStringとして宣言されます。 キューに入れるデータのタイプがStringでない場合は、MQPUT の代わりに MQPUTAny 呼び出しを使用してください。MQPUTAny 呼び出しは MQPUT 呼び出しと同じパラメーターを使用しますが、
BufferパラメーターはタイプAnyとして宣言されるので、どのタイプのデータでもキューに書き込むことができます。 ただし、Bufferを検査して、サイズがBufferLengthバイト以上であることを確認することはできません。
C 言語での呼び出し
MQPUT (Hconn, Hobj, &MsgDesc, &PutMsgOpts, BufferLength, Buffer,
&CompCode, &Reason);
MQHCONN Hconn; /* Connection handle */
MQHOBJ Hobj; /* Object handle */
MQMD MsgDesc; /* Message descriptor */
MQPMO PutMsgOpts; /* Options that control the action of MQPUT */
MQLONG BufferLength; /* Length of the message in Buffer */
MQBYTE Buffer[n]; /* Message data */
MQLONG CompCode; /* Completion code */
MQLONG Reason; /* Reason code qualifying CompCode */
COBOL での呼び出し
CALL 'MQPUT' USING HCONN, HOBJ, MSGDESC, PUTMSGOPTS, BUFFERLENGTH,
BUFFER, COMPCODE, REASON.
** Connection handle
01 HCONN PIC S9(9) BINARY.
** Object handle
01 HOBJ PIC S9(9) BINARY.
** Message descriptor
01 MSGDESC.
COPY CMQMDV.
** Options that control the action of MQPUT
01 PUTMSGOPTS.
COPY CMQPMOV.
** Length of the message in BUFFER
01 BUFFERLENGTH PIC S9(9) BINARY.
** Message data
01 BUFFER PIC X(n).
** Completion code
01 COMPCODE PIC S9(9) BINARY.
** Reason code qualifying COMPCODE
01 REASON PIC S9(9) BINARY.
PL/I での呼び出し
call MQPUT (Hconn, Hobj, MsgDesc, PutMsgOpts, BufferLength, Buffer,
CompCode, Reason);
dcl Hconn fixed bin(31); /* Connection handle */
dcl Hobj fixed bin(31); /* Object handle */
dcl MsgDesc like MQMD; /* Message descriptor */
dcl PutMsgOpts like MQPMO; /* Options that control the action of
MQPUT */
dcl BufferLength fixed bin(31); /* Length of the message in Buffer */
dcl Buffer char(n); /* Message data */
dcl CompCode fixed bin(31); /* Completion code */
dcl Reason fixed bin(31); /* Reason code qualifying CompCode */
高水準アセンブラー呼び出し
CALL MQPUT,(HCONN,HOBJ,MSGDESC,PUTMSGOPTS,BUFFERLENGTH, X
BUFFER,COMPCODE,REASON)
HCONN DS F Connection handle
HOBJ DS F Object handle
MSGDESC CMQMDA , Message descriptor
PUTMSGOPTS CMQPMOA , Options that control the action of MQPUT
BUFFERLENGTH DS F Length of the message in BUFFER
BUFFER DS CL(n) Message data
COMPCODE DS F Completion code
REASON DS F Reason code qualifying COMPCODE
Visual Basic での呼び出し
MQPUT Hconn, Hobj, MsgDesc, PutMsgOpts, BufferLength, Buffer, CompCode,
Reason
Dim Hconn As Long 'Connection handle'
Dim Hobj As Long 'Object handle'
Dim MsgDesc As MQMD 'Message descriptor'
Dim PutMsgOpts As MQPMO 'Options that control the action of MQPUT'
Dim BufferLength As Long 'Length of the message in Buffer'
Dim Buffer As String 'Message data'
Dim CompCode As Long 'Completion code'
Dim Reason As Long 'Reason code qualifying CompCode'