5.4.2 デッドレターキューの使用
キューマネジャがメッセージを転送できないとき,キューマネジャはデッドレターキューにメッセージを登録します。このキューはキューマネジャの開始時に定義してください。
キューマネジャと同様にアプリケーションからデッドレターキューを使用できます。キューマネジャオブジェクトをMQOPEN命令でオープンし,DeadLetterQName属性をMQINQ命令で照会することによって,デッドレターキューの名前を調べることができます。
キューマネジャがメッセージをこのキューに登録するとき,メッセージにヘッダを追加します。その形式はMQDLH構造体(デッドレターヘッダ)で定義されます。MQDLH構造体については,マニュアル「TP1/Message Queue プログラム作成リファレンス」を参照してください。このヘッダにはあて先キューの名前やメッセージがデッドレターキューに登録された理由が記載されます。目的のキューにメッセージを登録する前には,問題を解決してヘッダを削除してください。MQDLH構造体が含まれることを示すために,キューマネジャはメッセージ記述子のFormatフィールドを変更します。
- MQDLH構造体
-
デッドレターキューにメッセージを登録するときには,すべてのメッセージにMQDLH構造体を追加することをお勧めします。
ヘッダをメッセージに追加することによって,デッドレターキューへ登録するにはメッセージが長過ぎてしまうことがあります。したがって,少なくともMQ_MSG_HEADER_LENGTHの値の分だけは,デッドレターキューに登録可能なメッセージ長よりもメッセージが短くなるように注意してください。キューに登録可能なメッセージの最大長は,キューのMaxMsgLength属性の値によって決定されます。デッドレターキューについては,この属性がキューマネジャの許容する最大長になるようにしてください。アプリケーションがメッセージを転送できない場合で,メッセージがデッドレターキューへの登録には長過ぎるときには,MQDLH構造体の解説に従って処理してください。
デッドレターキューを監視して,到着したメッセージが処理されるように独自のアプリケーションを用意してください。アプリケーションはトリガで動作させたり,一定間隔で動作させたりします。
データ変換が必要な場合には,MQGET命令にMQGMO_CONVERTオプションを使用するときに,キューマネジャがヘッダ情報を変換します。メッセージを登録するプロセスがMCAの場合には,ヘッダのあとに登録元メッセージのすべてのテキストが続きます。
ただし,TP1/Message Queueでは,MCAからデッドレターキューに登録するメッセージが長過ぎる場合,MQRC_MSG_TOO_BIG_FOR_Qで失敗します。
- 〈この項の構成〉
(1) デッドレターキューの処理
デッドレターキューの処理はローカルシステムの要件によって異なります。計画時には次に示す項目を参考にして検討してください。
-
MQMD構造体のFormatフィールドがMQFMT_DEAD_LETTER_HEADERであることから,メッセージにデッドレターキューヘッダがあるとわかります。
-
MCAがメッセージをデッドレターキューに登録すると,PutApplTypeフィールドはMQAT_QMGRになり,PutApplNameフィールドはキューマネジャ名称の先頭28バイトになります。
-
メッセージがデッドレターキューに登録された理由は,デッドレターキューヘッダのReasonフィールドにあります。
-
デッドレターキューヘッダには,あて先キュー名とキューマネジャ名の詳細があります。
-
メッセージをあて先キューに登録する前に回復しなければいけないフィールドは,デッドレターキューヘッダにあります。それらを次に示します。
-
Encoding
-
CodedCharSetId
-
Format
-
-
上記の三つのフィールドを除くと,メッセージ記述子は登録元アプリケーションによる登録時と同じ状態です。
デッドレターキューアプリケーションでは,次に示す項目を一つ以上実行してください。
-
Reasonフィールドを調べてください。次に示す理由の場合にはメッセージはMCAによって登録されたものです。
-
メッセージがチャネルの最大長よりも長大
理由コードはMQRC_MSG_TOO_BIG_FOR_CHANNEL
-
メッセージのあて先キューへの登録不可
理由コードはMQPUT命令で返されるMQRC_*
-
UOCによる要求
UOCによって返された理由コード。TP1/Message QueueではUOCによって返される値はMQFB_STOPPED_BY_MSG_EXITだけです。
-
配布リストを転送できない(自チャネルのバッファ方式がセグメント方式のとき,または相手チャネルが配布リストを受信できないとき)
理由コードはMQFB_XMIT_Q_MSG_ERROR
-
データ変換後のメッセージがチャネルの最大サイズよりも長大
理由コードはMQRC_CONVERTED_MSG_TOO_BIG
-
データ変換に失敗
理由コードは次に示すどれか
MQRC_FORMAT_ERROR
MQRC_NOT_CONVERTED
MQRC_SOURCE_CCSID_ERROR
MQRC_TARGET_CCSID_ERROR
MQFB_XMIT_Q_MSG_ERROR
-
MQXQH構造体が不正
MQFB_XMIT_Q_MSG_ERROR
-
-
可能な場合は,メッセージを目的のあて先に転送してください。
-
デッドレターキューへの登録の原因はわかったが即時に修正できないときは,破棄する前に一定期間メッセージを保持してください。
-
原因が分かればシステム管理者に問題の修正を指示してください。
-
破損などで処理できないメッセージは破棄してください。
デッドレターキューから回復したメッセージを処理する方法は二つあります。
-
メッセージがローカルキューあての場合には,次に示す項目を実行してください。
-
アプリケーションデータを取り出すのに必要なコード変換の実行
-
ローカル機能の場合でのコード変換の実行
-
メッセージ記述子の内容を回復し,変換後のメッセージをローカルキューに登録
-
-
メッセージがリモートキューあての場合には,メッセージをキューに登録してください。