Hitachi

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


10.2.4 バッファ領域長の指定

MQGET命令のBufferLengthパラメタには,取り出したメッセージを保持するのに使用するバッファ領域長を指定してください。この領域長を決定する方法は三つあります。

  1. アプリケーションで取り出すメッセージの長さが既知の場合,該当する長さを指定してください。

    メッセージがバッファ領域長よりも長い場合にMQGET命令を完了させたいときには,MQGMO_ACCEPT_TRUNCATED_MSGをMQGMO構造体に指定できます。このとき,次に示すとおりに動作します。

    • 可能な範囲でバッファにメッセージが格納されます。

    • 命令は警告の完了コードを返します。

    • メッセージはキューから削除(バッファ領域に格納できない部分は破棄)され,検索カーソルが検索時に前進します。

    • メッセージの実際の長さはDataLengthパラメタに格納されます。

    MQGMO_ACCEPT_TRUNCATED_MSGの指定なしでも,警告付きで命令は完了します。しかし,メッセージはキューから削除されないで,検索カーソルは前進しません。

  2. バッファの長さを見積もります。領域長には0バイトを指定することもあります。MQGMO_ACCEPT_TRUNCATED_MSGは指定しないでください。MQGET命令が失敗(バッファが小さ過ぎるなど)する場合は,メッセージ長が命令のDataLengthパラメタに返されます。バッファには可能な範囲のメッセージが格納されますが,命令の処理は完了しません。該当するメッセージのMsgIdフィールドを保存してから,後続のMQGET命令を発行してください。このときに,正しい長さのバッファ領域を指定し,最初の命令で取得したMsgIdフィールドを指定します。

    他アプリケーションが同じキューを処理する場合には,自アプリケーションで後続のMQGET命令を発行する前に,他アプリケーションが必要なメッセージを削除することもあります。自アプリケーションには,存在しないメッセージを検索するためのむだな時間が掛かります。これを回避するには,最初はBufferLengthパラメタに0を指定してMQGMO_ACCEPT_TRUNCATED_MSGを使用して,必要なメッセージが見つかるまでキューを検索します。その後,MQGET命令にMQGMO_MSG_UNDER_CURSORを指定して再度発行してください。検索と取り出しの間に他アプリケーションがメッセージを削除する場合には,2回目のMQGET命令はキュー全体を検索しないで即時に失敗します。これはカーソル下にメッセージがないためです。

  3. キューとキューマネジャのMaxMsgLength属性は,受け付けることができるメッセージの最大長を定義します。メッセージ長がわからない場合は,MQINQ命令を使用してMaxMsgLength属性を照会し,その値をメッセージバッファの長さにしてください。

    性能を低下させないように,バッファの長さはできるだけ実際のメッセージ長に近づけてください。

注意

MQGET命令およびMQINQ命令では,アプリケーションで動的または静的に確保した領域に,情報を返却する場合があります。

そのため,実際に確保した領域の大きさがMQGET命令のBufferLengthパラメタ,MQINQ命令のIntAttrCountパラメタ,およびMQINQ命令のCharAttrsパラメタに指定された値より小さい場合,領域破壊など予期しない事象が発生するので動作は保証されません。