Hitachi

OpenTP1 Version 7 OpenTP1 メッセージキューイング機能 TP1/Message Queue プログラム作成の手引


3.3.5 報告メッセージとセグメント分割メッセージ

セグメント分割メッセージはTP1/Message Queue 05-00以降でサポートします。セグメント分割メッセージについては,「10.5.2 メッセージのセグメント分割」を参照してください。

メッセージがセグメント分割されているときに報告メッセージを生成すると,セグメント分割されていないときよりも多くの報告メッセージを受け取ることになります。

〈この項の構成〉

(1) システムで生成される報告メッセージ

メッセージをセグメント分割する場合,またはキューマネジャに分割させる場合で,完全なメッセージについて単一の報告メッセージを受け取る状況は一つだけです。

それは,メッセージ配布確認(COD)報告だけを要求し,メッセージを取り出すアプリケーションでMQGMO_COMPLETE_MSGを指定している状況です。

その他の状況では,セグメントごとに報告メッセージが発生するので,アプリケーションで複数の報告メッセージに対応できるよう準備してください。

注意

メッセージをセグメント分割するときに元のメッセージの先頭100バイトだけが返されるようにしたい場合には,100バイト目以上のオフセットに当たるセグメントでデータなしの報告メッセージを要求するよう,報告オプションの設定を変更してください。各セグメントが100バイトのデータを要求する設定のままMQGMO_COMPLETE_MSGオプションを指定したMQGET命令を発行して報告メッセージを取り出そうとすると,各オフセットで100バイトの読み込みデータが含まれる長大な報告メッセージが生成されます。その場合には,長大なバッファを用意するか,またはMQGMO_ACCEPT_TRUNCATED_MSGオプションを指定してください。

(2) アプリケーションで生成される報告メッセージ

アプリケーションで報告メッセージを生成する場合は,元のメッセージデータの先頭にあるヘッダを報告メッセージデータにコピーしてください。その後ろには,元のメッセージデータ(またはその他のユーザデータ)のすべてを追加したり,100バイトを追加したり,何も追加しないようにします。

MQMD構造体のFormatフィールドを参照して,どのヘッダをコピーすればよいか判断してください。連続する複数のヘッダが設定されていることがあります。

次に示すフォーマット名はヘッダを表します。

FormatフィールドはMQDLH構造体およびMQXQH構造体では独自の位置にあります。しかし,その他のヘッダは同じ位置にあります。

セグメント,グループ内のメッセージ,またはセグメント分割を許可されたメッセージで,バージョン1のMQMD構造体を使用して報告する場合,報告データはMQMDE構造体で始まるようにしてください。OriginalLengthフィールドには,元のメッセージデータの長さを設定してください。この長さには検出したヘッダの長さを含みません。

(3) 報告メッセージの取り出し

メッセージ到着確認(COA)報告メッセージ,またはメッセージ配布確認(COD)報告メッセージを要求した場合,MQGMO_COMPLETE_MSGオプションを指定するとメッセージが組み立てられます。MQGMO_COMPLETE_MSGオプションを指定したMQGET命令は,一つの完全な元のメッセージを表すのに十分な報告メッセージ(単一のタイプで同じGroupId)がキューにあると,成功します。報告メッセージ自身に完全な元のデータを含まない場合でも成功します。その場合は,データそのものがなくても各報告メッセージのOriginalLengthフィールドから,元のデータの長さがわかります。

この方法は幾つかの異なるタイプの報告メッセージがキューにある場合にも使用できます。MQGMO_COMPLETE_MSGオプションを指定したMQGET命令では,複数の報告メッセージで同じFeedbackコードを持てば報告メッセージを組み立てることができるからです。しかし,例外報告メッセージでは異なるFeedbackコードを持つことが多いので,通常はこの方法を使用できないことに注意してください。

この方法は完全なメッセージが到着したという肯定指示を取得するのに使用できます。しかし,到着したセグメントがある一方で幾つかのセグメントで例外(または保持時間の超過)が発生している可能性を考えなければいけないことがあります。上記のとおり,異なるFeedbackコードがセグメントごとに設定されていることが多いので,通常はMQGMO_COMPLETE_MSGオプションを指定したMQGET命令は使用できません。該当するセグメントについて,複数の報告メッセージを取得することになります。しかし,これについてはMQGMO_ALL_SEGMENTS_AVAILABLEオプションを使用する方法があります。

以上のことから,到着時に報告メッセージを取り出して,元のメッセージに何が発生しているのかアプリケーションで判断するようにしてください。報告メッセージのGroupIdフィールドを使用して元のメッセージと報告メッセージを関連づけることができます。Feedbackフィールドを使用して報告メッセージの種類を識別できます。どの方法を使うかはアプリケーションの要件によって異なります。

対処方法の例を次に示します。

あとから再送が可能な問い合わせメッセージのように,元のメッセージが重要でない場合には,孤立したセグメントが消去されるようにメッセージ保持時間を設定してください。

(4) セグメント分割をサポートしないキューマネジャ

セグメント分割をサポートするキューマネジャで報告メッセージを生成し,サポートしないキューマネジャで受信するときには,MQMDE構造体(報告メッセージのOffsetおよびOriginalLengthフィールドを識別する)が,0バイト,100バイト,または完全なメッセージの元のデータとともに,報告データに含まれます。

しかし,セグメント分割をサポートしないキューマネジャを,メッセージのセグメントが経由する場合には,元のメッセージにあるMQMDE構造体がデータとして扱われるのか注意が必要です。元のデータの0バイトが要求される場合には,報告データにはMQMDE構造体は含まれません。MQMDE構造体がないと報告メッセージは使用できません。

そこで,セグメント分割をサポートしないキューマネジャをメッセージが経由する可能性のあるときには,報告メッセージに少なくともデータの100バイトを含むよう要求してください。