MQDLH構造体 − デッドレターヘッダ
MQDLH構造体は,次のフィールドから構成されます。
|
フィールド(データタイプ) |
内容 |
初期値 |
|---|---|---|
|
StrucId(MQCHAR4型) |
構造体識別子 |
MQDLH_STRUC_ID |
|
Version(MQLONG型) |
構造体バージョン番号 |
MQDLH_VERSION_1 |
|
Reason(MQLONG型) |
メッセージ通知理由 |
MQRC_NONE |
|
DestQName(MQCHAR48型) |
あて先キュー名 |
ヌル文字列/空白 |
|
DestQMgrName(MQCHAR48型) |
あて先キューマネジャ名 |
ヌル文字列/空白 |
|
Encoding(MQLONG型) |
MQDLH構造体に続くデータのマシンコード形式 |
0 |
|
CodedCharSetId(MQLONG型) |
MQDLH構造体に続くデータの文字セット識別子 |
MQCCSI_UNDEFINED |
|
Format(MQCHAR8型) |
MQDLH構造体に続くデータのフォーマット名 |
MQFMT_NONE |
|
PutApplType(MQLONG型) |
登録アプリケーションタイプ |
0 |
|
PutApplName(MQCHAR28型) |
登録アプリケーション名 |
ヌル文字列/空白 |
|
PutDate(MQCHAR8型) |
登録日付 |
ヌル文字列/空白 |
|
PutTime(MQCHAR8型) |
登録時刻 |
ヌル文字列/空白 |
概要
目的
MQDLH構造体には,デッドレターキューに格納されるメッセージのアプリケーションデータの先頭に付けられる情報を記述します。デッドレターキューにメッセージが届くのは,次のどちらかの場合です。
-
キューマネジャまたはMCAが,デッドレターキューにメッセージを転送した場合
-
アプリケーションが直接,デッドレターキューにメッセージを登録した場合
セグメントであるメッセージが,MQDLH構造体を先頭に付けて登録される場合,キューマネジャは特別な処理をします。詳細については,この章の「MQMDE構造体 − メッセージ記述子の拡張」を参照してください。
フォーマット名
MQFMT_DEAD_LETTER_HEADER
文字セットおよびマシンコード
MQDLH構造体のフィールドは,MQDLH構造体の前にあるヘッダ構造体のCodedCharSetIdおよびEncodingフィールドの文字セットおよびマシンコードに従います。また,MQDLH構造体がアプリケーションメッセージデータの先頭にある場合,MQMD構造体のCodedCharSetIdおよびEncodingフィールドに従います。
文字セットは,キュー名に有効な1バイト文字セットにする必要があります。
使用方法
アプリケーションが直接デッドレターキューにメッセージを登録する場合,メッセージデータの先頭にMQDLH構造体を付ける必要があります。また,構造体の各フィールドを適切に初期化してください。MQDLH構造体を付けたかどうか,および各フィールドの値が正しいかどうかは,キューマネジャによってチェックされません。
デッドレターキューに登録するメッセージが長過ぎる場合,アプリケーションは次のどれかの処置をしてください。
-
デッドレターキューに登録できるように,メッセージの後部を切り捨てます。
-
補助記憶装置にメッセージを格納し,その旨を示す例外報告メッセージをデッドレターキューに登録します。
-
メッセージを破棄し,登録元アプリケーションにエラーを通知します。重要なメッセージの場合は,メッセージを破棄するときに注意が必要です。この場合,登録元アプリケーションがメッセージの複製を保持していると判明しているときだけ,破棄してください。例えば,MCAによって通信回線から受け取ったメッセージの場合などです。
上記のどの方法を採用するかは,アプリケーションの設計方法によって異なります。
セグメントであるメッセージがMQDLH構造体を先頭にして登録されたとき,キューマネジャは特別な処理をします。詳細については,この章の「MQMDE構造体 − メッセージ記述子の拡張」を参照してください。
デッドレターキューへのメッセージの登録
メッセージをデッドレターキューへ登録するとき,MQPUTまたはMQPUT1命令に使用するMQMD構造体は,そのメッセージに関連するMQMD構造体と同一にする必要があります(通常は,MQGET命令によって返されるMQMD構造体です)。ただし,次の例外があります。
-
CodedCharSetIdフィールドとEncodingフィールドには,MQDLH構造体の各フィールドで使用する値を設定します。
-
Formatフィールドには,MQFMT_DEAD_LETTER_HEADERを設定します。この値は,MQDLH構造体でデータが始まることを示します。
-
次に示すコンテキストフィールドには,状況に合ったコンテキストオプションを使用して設定します。
-
UserIdentifier
-
AccountingToken
-
ApplIdentityData
-
PutApplType
-
PutApplName
-
PutDate
-
PutTime
-
ApplOriginData
-
-
デッドレターキューに登録するメッセージがそれ以前のメッセージと無関係の場合,MQPMO_DEFAULT_CONTEXTオプションを使用します。このオプションを使用すると,すべてのコンテキストフィールドに省略時の値が設定されます。
-
サーバアプリケーションが受信したメッセージをデッドレターキューに登録する場合,元のコンテキスト情報を保存するために,MQPMO_PASS_ALL_CONTEXTオプションを使用します。
-
サーバアプリケーションが受信したメッセージに対する応答をデッドレターキューに登録する場合,MQPMO_PASS_IDENTITY_CONTEXTオプションを使用します。このオプションを使用すると,識別コンテキストの情報は保存されます。しかし,登録元コンテキストの情報は,サーバアプリケーションのコンテキスト情報に変更されます。
-
MCAが通信回線から受け取ったメッセージをデッドレターキューに登録する場合,元のコンテキスト情報を保存するためにMQPMO_SET_ALL_CONTEXTオプションを使用します。
MQDLH構造体中の各フィールドは,次のように設定してください。
-
CodedCharSetIdフィールド,EncodingフィールドおよびFormatフィールドには,MQDLH構造体に続くデータに応じた値を設定します。通常は,登録元のメッセージ記述子の値を設定します。
-
次に示すコンテキストフィールドには,デッドレターキューにメッセージを登録するアプリケーションに応じた値を設定します。これらの値は,登録元メッセージとは関係ありません。
-
PutApplType
-
PutApplName
-
PutDate
-
PutTime
-
-
そのほかのフィールドには,適切な値を設定します。
アプリケーションは,各フィールドの値が適切かどうか,および文字フィールドの余りが空白で埋められているかどうかを確認する必要があります。MQDLH構造体中の文字データは,ヌル文字で終了できません。キューマネジャは,MQDLH構造体のヌル文字以降の文字を,空白に置き換えません。
デッドレターキューからのメッセージの取り出し
アプリケーションは,デッドレターキューから取り出したメッセージが,MQDLH構造体で始まっているかどうかを確認する必要があります。メッセージ記述子MQMD構造体のFormatフィールドを調べることで,それを確認できます。FormatフィールドがMQFMT_DEAD_LETTER_HEADERの場合,メッセージデータがMQDLH構造体で始まっていると判断できます。なお,メッセージを取り出すアプリケーションは,メッセージが長過ぎて後部が切り捨てられた場合があることに注意してください。
フィールド
構造体を構成するフィールドについて,アルファベット順に説明します。
● CodedCharSetId(MQLONG型) 文字セット識別子
MQDLH構造体に続くデータの文字セット識別子です。
MQDLH構造体に続くデータ(通常は,元のメッセージから取られたデータ)の文字セット識別子を指定します。MQDLH構造体自身の文字データには適用されません。
MQPUTまたはMQPUT1命令では,アプリケーションはデータに合った値をこのフィールドに設定する必要があります。
- MQCCSI_INHERIT
-
この構造体の文字セット識別子を引き継ぎます。
この構造体に続くデータの文字データは,この構造体と同じ文字セットです。
メッセージで送信される構造体のこの値を,キューマネジャは構造体の実際の文字セット識別子に変更します。エラーが発生しない場合,MQGET命令ではMQCCSI_INHERITは返されません。
MQMD構造体のPutApplTypeフィールドの値がMQAT_BROKERの場合,MQCCSI_INHERITは使用できません。
このフィールドの初期値はMQCCSI_UNDEFINEDです。
● DestQMgrName(MQCHAR48型) あて先キューマネジャ名
登録元メッセージのあて先であるキューマネジャの名称です。
このフィールドの長さは,MQ_Q_MGR_NAME_LENGTHに定義されています。
このフィールドの初期値は,C言語ではヌル文字列です。そのほかのプログラミング言語では,48個の空白です。
● DestQName(MQCHAR48型) あて先キュー名
登録元メッセージのあて先キューの名称です。
このフィールドの長さは,MQ_Q_NAME_LENGTHに定義されています。
このフィールドの初期値は,C言語ではヌル文字列です。そのほかのプログラミング言語では,48個の空白です。
● Encoding(MQLONG型) マシンコード形式
MQDLH構造体に続くデータのマシンコード形式です。
MQDLH構造体に続くデータ(通常は,元のメッセージから取られたデータ)のマシンコード形式を指定します。MQDLH構造体自身の数値データには適用されません。
MQPUTおよびMQPUT1命令では,アプリケーションはデータに合った値をこのフィールドに設定する必要があります。
このフィールドの初期値は0です。
● Format(MQCHAR8型) フォーマット名
MQDLH構造体に続くデータのフォーマット名です。
MQDLH構造体に続くデータ(通常は元のメッセージから取られたデータ)のフォーマット名を指定します。
MQPUTおよびMQPUT1命令では,アプリケーションはデータに合った値をこのフィールドに設定する必要があります。このフィールドの設定方法はMQMD構造体のFormatフィールドと同じです。
このフィールドの長さは,MQ_FORMAT_LENGTHに定義されています。
このフィールドの初期値はMQFMT_NONEです。
● PutApplName(MQCHAR28型) 登録アプリケーション名
メッセージをデッドレターキューに登録するアプリケーションの名称です。
名称の形式は,PutApplTypeフィールドの値に合わせます。この章の「MQMD構造体 − メッセージ記述子」でPutApplNameフィールドの説明を参照してください。
キューマネジャがデッドレターキューにメッセージを転送する場合,PutApplNameフィールドの値はキューマネジャ名の先頭から28文字までです。キューマネジャは,必要に応じて余りを空白で埋めます。
このフィールドの長さは,MQ_PUT_APPL_NAME_LENGTHに定義されています。
このフィールドの初期値は,C言語ではヌル文字列です。そのほかのプログラミング言語では,28個の空白です。
● PutApplType(MQLONG型) 登録アプリケーションタイプ
メッセージをデッドレターキューに登録するアプリケーションのタイプです。
このフィールドの意味は,メッセージ記述子MQMD構造体のPutApplTypeフィールドと同じです。
キューマネジャがデッドレターキューにメッセージを転送する場合,PutApplTypeフィールドの値はMQAT_QMGRです。
このフィールドの初期値は0です。
● PutDate(MQCHAR8型) 登録日付
メッセージがデッドレターキューに転送された日付です。
キューマネジャは次の形式を使用します。
- YYYYMMDD
-
YYYY:年(4けたの10進数)
MM:月(01〜12の10進数)
DD:日(01〜31の10進数)
PutDateフィールドとPutTimeフィールドには,グリニッジ標準時(GMT)を使用します。システムの時計を正しく設定してください。
このフィールドの長さは,MQ_PUT_DATE_LENGTHに定義されています。
このフィールドの初期値は,C言語ではヌル文字列です。そのほかのプログラミング言語では,8個の空白です。
● PutTime(MQCHAR8型) 登録時刻
メッセージがデッドレターキューに転送された時刻です。
キューマネジャは次の形式を使用します。
- HHMMSSTH
-
HH:時(00〜23の10進数)
MM:分(00〜59の10進数)
SS:秒(00〜59の10進数)
T:1/10秒 (0〜9の10進数)
H:1/100秒(0〜9の10進数)
PutDateフィールドとPutTimeフィールドには,グリニッジ標準時(GMT)を使用します。システムの時計を正しく設定してください。
このフィールドの長さは,MQ_PUT_TIME_LENGTHに定義されています。
このフィールドの初期値は,C言語ではヌル文字列です。そのほかのプログラミング言語では,8個の空白です。
● Reason(MQLONG型) メッセージ通知理由
メッセージがデッドレターキューに届いた理由を示します。MQFB_*,またはMQRC_*のどちらか(例:MQRC_Q_FULL)で示されます。
MQFB_*の中には,このフィールドでだけ使用されるものがあります。それらの値は,デッドレターキューへ転送されるトリガメッセージに関するものです。
- MQFB_APPL_CANNOT_BE_STARTED
-
アプリケーションを開始できませんでした。
トリガモニタアプリケーションが,トリガメッセージのApplIdフィールドに指定されたアプリケーションを起動できませんでした。詳細は,この章の「MQTM構造体 − トリガメッセージ」を参照してください。
- MQFB_TM_ERROR
-
トリガメッセージが不正です。
トリガモニタアプリケーションが,MQTM構造体で次のどれかの不正を発見しました。
-
StrucIdフィールドが不正です。
-
Versionフィールドを認識できません。
-
トリガメッセージ長がMQTM構造体に対して不十分です。
-
- MQFB_APPL_TYPE_ERROR
-
アプリケーションタイプが不正です。
トリガメッセージのApplTypeフィールドが不正のため,アプリケーションを起動できませんでした。詳細は,この章の「MQTM構造体 − トリガメッセージ」を参照してください。
- MQFB_BIND_OPEN_CLUSRCVR_DEL
-
クラスタレシーバチャネルが削除されました。
MQOO_BIND_ON_OPENオプションでオープンされたクラスタキューあてのメッセージがSYSTEM.CLUSTER.TRANSMIT.QUEUEにありました。しかし,メッセージが送信される前に,あて先キューにメッセージを転送するために使用するリモートのクラスタレシーバチャネルが削除されました。MQOO_BIND_ON_OPENが指定されたので,キューがオープンされたときに選択されたチャネルだけがメッセージを転送できます。このチャネルが使用不能なので,メッセージはデッドレターキューに登録されました。
- MQFB_NOT_A_REPOSITORY_MSG
-
メッセージはリポジトリメッセージではありません。
- MQFB_STOPPED_BY_CHAD_EXIT
-
メッセージがチャネル自動定義出口によって停止されました。
- MQFB_XMIT_Q_MSG_ERROR
-
転送キュー上のメッセージのフォーマットが不正です。
転送キュー上のメッセージのフォーマット不正を,MCAが発見しました。MCAは,このフィードバックコードを使用して,メッセージをデッドレターキューに登録します。
このフィールドの初期値はMQRC_NONEです。