BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   BEA Tuxedo COBOL リファレンス   |   先頭へ   |   前へ   |   次へ   |   目次

 


TPDEQUEUE(3cbl)

名前

TPDEQUEUE() - キューからメッセージを取り出すルーチン

形式

01 TPQUEDEF-REC.
COPY TPQUEDEF.

01
TPTYPE-REC.
COPY TPTYPE.

01
DATA-REC.
COPY User data.

01
TPSTATUS-REC.
COPY STATDEF.

CALL "TPDEQUEUE" USING
TPQUEDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.

機能説明

TPDEQUEUE() は、キュー・スペース QSPACE-NAME 内の QNAME で指定されるキューから、処理するメッセージを取り出します。

省略時設定では、キューの先頭のメッセージが取り出されます。 キュー上のメッセージの順序は、そのキューの作成時に定義されます。 アプリケーションは、MSGID を使用してメッセージ識別子を指定するか、または CORRID を使用して相関識別子を指定することにより、特定のメッセージをキューから取り出すことを要求できます。 メッセージを現在取り出せない場合には、アプリケーションはメッセージを待つことを示すために、TPQUEDEF-REC 設定を使用することもできます。 また、TPQUEDEF-REC 構造体を使用して、メッセージを読み出してもそれがキューから削除されないようにしたり、キュー上の相対位置が変更されないようにすることが可能です。 この後のこのレコードについての説明を参照してください。.

DATA-REC は、キューから取り出されたメッセージの読み込み先を指定します。入力時の LEN は、DATA-REC へ移動する最大バイト数を示します。 正常終了時には、LEN には、DATA-REC へ移動された実際のバイト数が入ります。 REC-TYPE および SUB-TYPE には、それぞれ応答のタイプおよびサブタイプが入ります。 応答が DATA-REC より大きい場合は、DATA-REC にはこのレコードに入るバイト数分のみが入ります。応答の残りは破棄され、TPDEQUEUE() は異常終了して [TPTRUNCATE] を返します。

正常終了時に LEN0 である場合は、応答にはデータ部がなく、DATA-REC は変更されていません。 入力時に LEN0 にすると、エラーになります。

呼び出し元がトランザクション・モードにあり、TPTRAN が設定されている場合は、メッセージは、トランザクション・モードでキューから取り出されます。 この結果、TPDEQUEUE が正常終了して呼び出し元のトランザクションが正常にコミットされると、メッセージはキューから削除されます。 呼び出し元のトランザクションが、明示的に、またはトランザクション・タイムアウトあるいはなんらかの通信エラーの結果としてロールバックされると、メッセージはキュー上に残されます。つまり、キューからのメッセージの削除もロールバックされます。 同じトランザクション内で、同じメッセージの登録と取り出しを行うことはできません。

呼び出し元がトランザクション・モードにないか、または TPNOTRAN が設定されている場合は、メッセージはトランザクション・モードではキューから取り出されません。 トランザクション・モードでない場合に通信エラーまたはタイムアウトが発生すると、アプリケーションには、メッセージが正しくキューから取り出されたかどうかがわからず、メッセージが失われることがあります。

次に、TPQUEDEF-REC の有効な設定の一覧を示します。

TPNOTRAN

呼び出し元がトランザクション・モードにあり、この設定が使用されていると、メッセージは呼び出し元と同じトランザクション内ではキューから取り出されません。 この値を真に設定する、トランザクション・モードの呼び出し元は、やはりトランザクション・タイムアウトの影響を受けます (それ以外はなし)。 この設定を使用した状態で呼び出されたキューからのメッセージの取り出しに失敗した場合、呼び出し元のトランザクションは影響されません。TPNOTRAN または TPTRAN が設定されていなければなりません。

TPTRAN

呼び出し元がトランザクション・モードにあり、この設定が使用されていると、メッセージは呼び出し元と同じトランザクション内でキューから取り出されます。 呼び出し元がトランザクション・モードにない場合は、この設定は無視されます。TPNOTRAN または TPTRAN が設定されていなければなりません。

TPNOBLOCK

ブロッキング状態が存在すると、メッセージはキューから取り出されません。 TPNOBLOCK を設定した場合、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング状態が存在すると、呼び出しは異常終了し、TP-STATUSTPEBLOCK が設定されます。 TPNOBLOCK を設定し、ターゲット・キューが別のアプリケーションによって排他的にオープンされているというブロッキング状態が存在する場合、呼び出しは異常終了し、TP-STATUS TPEDIAGNOSTIC が設定され、TPQUEDEF レコードの DIAGNOSTIC フィールドに QMESHARE が設定されます。 後者の場合、BEA Tuxedo システム以外の BEA 製品ベースのアプリケーションが、キューイング・サービス API (QSAPI) を使用して読み取りおよび書き込みを排他的に行うため、キューをオープンしています。TPNOBLOCK または TPBLOCK が設定されていなければなりません。

TPBLOCK

TPBLOCK が設定されている場合にブロッキング状態が存在すると、その状態が解消されるかタイムアウト (トランザクション・タイムアウトまたはブロッキング・タイムアウト) が発生するまで、呼び出し元はブロックされます。TPQWAIT の設定が指定された場合は、このブロッキング条件には、キュー自体の上でのブロッキングは含まれません。TPNOBLOCK または TPBLOCK が設定されていなければなりません。

TPNOTIME

この設定は、呼び出し元が無制限にブロックでき、ブロッキング・タイムアウトの影響を受けないようにすることを指定します。 トランザクション・タイムアウトは引き続き発生する可能性があります。TPNOTIME または TPTIME が設定されていなければなりません。

TPTIME

このフラグは、ブロッキング条件が存在し、ブロッキング時間に達すると、呼び出し元がブロッキング・タイムアウトを受け取ることを示します。TPNOTIME または TPTIME が設定されていなければなりません。

TPNOCHANGE

この設定を使用すると、DATA-REC のタイプは変更できません。 つまり、受信側が着信レコードのタイプを識別できる場合、応答レコードのタイプおよびサブタイプは、それぞれ TPTYPE-REC 内の REC-TYPE IN および TPTYPE-REC 内の SUB-TYPE IN と一致しなければなりません。TPNOCHANGE または TPCHANGE が設定されていなければなりません。

TPCHANGE

受信側が着信レコードのタイプを識別するかぎり、キューから取り出されたメッセージのタイプとサブタイプの両方または片方は、それぞれ TPTYPE-REC 内の REC-TYPE および TPTYPE-REC 内の SUB-TYPE に指定されたタイプまたはサブタイプと異なっていることが可能です。TPNOCHANGE または TPCHANGE が設定されていなければなりません。

TPSIGRSTRT

シグナルが関数内部のシステム・コールを中断した場合、中断されたシステム・コールは再発行されます。 TPNOSIGRSTRT または TPSIGRSTRT が設定されていなければなりません。

TPNOSIGRSTRT

ルーチン内部のシステム・コールがシグナルによって中断された場合、中断されたシステム・コールは再開されず、ルーチンは異常終了します。 TPNOSIGRSTRT または TPSIGRSTRT が設定されていなければなりません。

TPDEQUEUE() が正常終了すると、アプリケーションは TPQUEDEF-REC を使用してメッセージに関する追加情報を取得できます。 この情報には、キューから取り出されたメッセージのメッセージ識別子、すべての応答または異常終了メッセージに付随し発信元がメッセージと元の要求を結び付けることができるようにする相関識別子、メッセージに対する配信サービスの品質、メッセージの応答に対する配信サービスの品質、応答が要求された場合は応答キューの名前、およびメッセージをキューから取り出すときの失敗に関する情報をアプリケーションが登録できる異常終了キューの名前が含まれます。 これらについて以下に説明します。

制御構造体

TPQUEDEF-REC は、アプリケーション・プログラムが、キューからのメッセージの取り出しに関連する情報を渡したり、取得したりするために使用します。 TPQUEDEF-REC の設定は、構造体の他のどの要素が有効であるかを示すために使用されます。

TPDEQUEUE() への入力時には、次の要素を TPQUEDEF-REC に設定できます。

05 MSGID    PIC X(32).
05 CORRID PIC X(32).

TPDEQUEUE() の入力情報を制御する TPQUEDEF-REC の有効な設定の一覧を次に示します。

TPQGETNEXT

この値を設定すると、デフォルトのキューの順序を使用して、キュー上の次のメッセージが取り出されることを要求します。TPQGETNEXTTPQGETBYMSGID、または TPQGETBYCORRID のいずれかを設定しなければなりません。

TPQGETBYMSGID

この値を設定すると、MSGID で識別されるメッセージがキューから取り出されることを要求します。 メッセージ識別子は、事前の TPENQUEUE() 呼び出しによって返されます。 メッセージがあるキューから別のキューに移動した場合、メッセージ識別子は正しい値を示さないので注意が必要です。 また、メッセージ識別子の値は 32 バイト全体が意味を持つので、MSGID に指定される値は、たとえば空白類を埋め込むなどして完全に初期化される必要があります。

TPQGETNEXTTPQGETBYMSGID、または TPQGETBYCORRID のいずれかを設定しなければなりません。

TPQGETBYCORRID

この値を設定すると、CORRID で識別されるメッセージが取り出されることを要求します。 相関識別子は、アプリケーションが TPENQUEUE() によってメッセージをキューに登録するときに指定されます。 相関識別子の値は 32 バイト全体が意味を持つので、CORRID で識別される値は、たとえば空白類を埋め込むなどして完全に初期化される必要があります。

TPQGETNEXTTPQGETBYMSGID、または TPQGETBYCORRID のいずれかを設定しなければなりません。

TPQWAIT

この値を設定すると、キューが空の場合にはエラーが返されません。 代わりに、メッセージを取り出せるようになるまで、プロセスは待つ必要があります。 メッセージが取り出せるまで待機しない場合は、TPQNOWAIT を設定します。 TPQWAITTPQGETBYMSGID または TPQGETBYCORRID とともに設定されると、指定されたメッセージ識別子または相関識別子を持つメッセージがキューに存在しない場合、エラーは返されません。 代わりに、基準を満たすメッセージを取り出せるようになるまで、プロセスは待つ必要があります。 プロセスは呼び出し元のトランザクション・タイムアウトの影響を受けます。また、トランザクション・モードでない場合、プロセスは TMQUEUE プロセスで -t オプションによって指定されたタイムアウトの影響を受けます。

基準に一致するメッセージがすぐには取り出せず、設定されているアクション・リソースの限界に達すると、TPDEQUEUEは異常終了し、TP-STATUSTPEDIAGNOSTIC が設定され、DIAGNOSTICQMESYSTEM が設定されます。

条件を満たすメッセージがすぐに取り出せない場合は、TPQWAIT 制御パラメータを指定するそれぞれの TPDEQUEUE() 要求で、キュー・マネージャ (TMQUEUE) のアクション・オブジェクトを利用できることが必要です。 アクション・オブジェクトを利用できない場合、TPDEQUEUE() 要求は異常終了します。 利用できるキュー・マネージャのアクション数は、キュー・スペースの作成時または変更時に指定されます。 待機中のキューからの取り出し要求が完了すると、関連するアクション・オブジェクトは別の要求で使用できるようになります。

TPQPEEK

TPQPEEK を設定すると、指定されたメッセージを読み取ってもキューから削除されなくなります。この場合、TPNOTRAN フラグが設定されている必要があります。 トランザクション内でキューに登録されたメッセージやキューから取り出されたメッセージは、そのトランザクションが完了するまで読み取ることができません。

あるスレッドで TPQPEEK を使用してメッセージをキューから非破壊的に取り出す場合、非破壊的な取り出し要求をシステムが処理する少しの間、ほかの非ブロッキング状態のメッセージ取り出し操作からそのメッセージが見えないことがあります。 たとえば、メッセージ識別子や相関識別子などの特定の選択基準を使用してメッセージをキューから取り出す操作で、現在、非破壊的なキューから取り出し中のメッセージを検索する場合などです。

TPDEQUEUE() からの出力時には、次の要素が TPQUEDEF-REC に設定されます。

05 PRIORITY                PIC S9(9) COMP-5. 
05 MSGID PIC X(32).
05 CORRID PIC X(32).
05 TPQUEQOS-DELIVERY-FLAG PIC S9(9) COMP-5.
05 TPQUEQOS-REPLY-FLAG PIC S9(9) COMP-5.
05 REPLYQUEUE PIC X(15).
05 FAILUREQUEUE PIC X(15).
05 DIAGNOSTIC PIC S9(9) COMP-5.
05 CLIENTID OCCURS 4 TIMES PIC S9(9) COMP-5
05 APPL-RETURN-CODE PIC S9(9) COMP-5.
05 APPKEY PIC S9(9) COMP-5.

TPDEQUEUE() からの出力情報を制御する TPQUEDEF-REC の有効な設定を次に示します。 どの設定でも、TPDEQUEUE() の呼び出し時に真の場合、メッセージがキューに入れられたときに提供された値が、レコード内の対応する要素に格納され、その設定は真のままになります。 値を利用できない、つまりメッセージがキューに入れられたときに値が提供されていない場合、または TPDEQUEUE()の呼び出し時に設定が真でない場合、その設定が真でない状態で TPDEQUEUE() は完了します。

TPQPRIORITY

この値を設定し、TPDEQUEUE() の呼び出しが正常終了し、メッセージが明示的な優先順位でキューに登録されていた場合は、その優先順位が PRIORITY に格納されます。 優先順位は 1 から 100 の範囲 (1 と 100 を含みます) で、番号が大きいほど優先順位は高くなります (つまり大きい番号のメッセージが、番号の小さいメッセージより先にキューから取り出されます)。 TPQNOPRIORITY が設定されていると、優先順位は利用できません。

メッセージがキューに入れられたときに明示的な優先順位が指定されていない場合、そのメッセージの優先順位は 50 になります。

TPQMSGID

この値を設定し、TPDEQUEUE() の呼び出しが正常終了した場合は、メッセージ識別子が MSGIDに格納されます。 メッセージ識別子の値は 32 バイト全体が意味を持ちます。 TPQNOMSGID が設定されていると、メッセージ識別子は利用できません。

TPQCORRID

この値を設定し、TPDEQUEUE() の呼び出しが正常終了し、メッセージが相関識別子を付けてキューに登録された場合は、相関識別子が CORRID に格納されます。 相関識別子の値は 32 バイト全体が意味を持ちます。 BEA Tuxedo /Q からのメッセージに対するすべての応答には、元の要求メッセージの相関識別子が付きます。 TPQNOCORRID が設定されていると、相関識別子は利用できません。

TPQDELIVERYQOS

この値を設定し、TPDEQUEUE() の呼び出しが正常終了し、配信サービスの品質を設定してメッセージをキューに登録した場合、TPQUEQOS-DELIVERY-FLAG で指定されるフラグ TPQQOSDELIVERYDEFAULTPERSISTTPQQOSDELIVERYPERSISTENT、または TPQQOSDELIVERYNONPERSISTENT が配信サービスの品質を示します。 TPQNODELIVERYQOS を設定すると、配信サービスの品質は指定できなくなります。

メッセージがキューに登録されたときに配信サービスの品質が明示的に指定されていない場合は、ターゲットキューのデフォルトの配信方針によってメッセージの配信サービスの品質が決まります。

TPQREPLYQOS

この値を設定し、TPDEQUEUE() の呼び出しが正常終了し、応答サービスの品質を設定してメッセージをキューに登録した場合は、TPQUEQOS-REPLY-FLAG で指定されるフラグ TPQQOSREPLYDEFAULTPERSISTTPQQOSREPLYPERSISTENT、または TPQQOSREPLYNONPERSISTENT が応答サービスの品質を示します。 TPQNOREPLYQOS を設定すると、応答サービスの品質は指定できなくなります。

メッセージがキューに登録されたときに応答サービスの品質が明示的に指定されていない場合は、REPLYQUEUE キューのデフォルトの配信方針によって応答の配信サービスの品質が決まります。 デフォルトの配信方針は、メッセージに対する応答がキューに登録されるときに決まります。 つまり、元のメッセージがキューに登録されてから応答が登録されるまでの間に、応答キューのデフォルトの配信方針が変更された場合は、最後に応答が登録された時点で有効な方針が使用されます。

TPQREPLYQ

この値を設定し、TPDEQUEUE() の呼び出しが正常終了し、メッセージが応答キューを使用してキューに入れられた場合は、その応答キューの名前が REPLYQUEUE に格納されます。メッセージへの応答はすべて、要求メッセージと同じキュー・スペース内の、指定された応答キューに入る必要があります。 TPQNOREPLYQ が設定されていると、応答キューは利用できません。

TPQFAILUREQ

この値を設定し、TPDEQUEUE() の呼び出しが正常終了し、メッセージが異常終了キューを使用してキューに入れられた場合は、その異常終了キューの名前が FAILUREQUEUE に格納されます。すべての異常終了メッセージは、要求メッセージと同じキュー・スペース内の、指定された異常終了キューに入る必要があります。 TPQNOFAILUREQ が設定されていると、異常終了キューは利用できません。

TPQUEDEF-REC の残りの設定は、TPDEQUEUE() が呼び出されると、次の値に設定されます。 TPQNOTOPTPQNOBEFOREMSGIDTPQNOTIME_ABSTPQNOTIME_RELTPQNOEXPTIME_ABSTPQNOEXPTIME_REL、および TPQNOEXPTIME_NONE

TPDEQUEUE() の呼び出しが異常終了し、TP-STATUSTPEDIAGNOSTIC が設定された場合は、異常終了の原因を示す値が DIAGNOSTIC に返されます。 返される可能性のある値は、この後の「診断」の項で定義しています。

また、TPDEQUEUE() 呼び出しが正常終了した場合の出力時には、APPKEY にアプリケーション認証キーが設定され、CLIENTID に要求の発信元であるクライアントの識別子が設定され、APPL-RETURN-CODE にメッセージ登録時に設定されたユーザ戻りコードが設定されます。

戻り値

TPDEQUEUE() は正常終了時には、TP-STATUS に [TPOK] を設定します。

エラー

次の条件が発生すると、TPDEQUEUE() は異常終了し、TP-STATUS に次の値を設定します。特に説明がなければ、この障害は呼び出し元のトランザクションには影響しません。

[TPEINVAL]

無効な引数が指定されました (たとえば、QSPACE-NAMESPACES である場合、TPQUEDEF-REC の設定が無効である場合など)。

[TPENOENT]

QSPACE-NAME を利用できないので、これにアクセスできません (関連する TMQUEUE(5) サーバは利用できません)。または、グローバル・トランザクション・テーブル (GTT) にエントリがないので、グローバル・トランザクションを開始できません。

[TPEOTYPE]

キューから取り出されたメッセージの REC-TYPE および SUB-TYPE のいずれかは、呼び出し元が認識しているものではありません。あるいは、TPNOCHANGE が設定されていて、REC-TYPESUB-TYPE が、キューから取り出されたメッセージの REC-TYPE および SUB-TYPE と一致しません。 DATA-RECTPTYPE-REC も変更されません。 呼び出しがトランザクション・モードで行われ、このエラーが発生すると、トランザクションはアボートのみになり、メッセージはキューに残ります。

[TPTRUNCATE]

着信メッセージのサイズが、LEN で指定されたサイズより大きいことを示します。 LEN で指定されたデータ長分のみが DATA-REC へ移動され、残りのデータは破棄されます。

[TPETIME]

タイムアウトが発生しました。 呼び出し元がトランザクション・モードの場合は、トランザクション・タイムアウトが発生し、そのトランザクションはアボートのみになります。トランザクション・モードでない場合、ブロッキング・タイムアウトが発生し、TPBLOCKTPTIME の両方が指定されていました。 いずれの場合も、DATA-RECTPTYPE-REC も変更されません。 トランザクション・タイムアウトが発生すると、トランザクションがアボートされない限り、TPDEQUEUE() または TPENQUEUE() を呼び出そうとしても TPETIME が発生して失敗します。

[TPEBLOCK]

ブロッキング条件が存在し、TPBLOCK が設定されていました。

[TPGOTSIG]

シグナルが受信され、TPNOSIGRSTRT が設定されていました。

[TPEPROTO]

TPDEQUEUE() の呼び出し方法が不適切です。 キューまたはトランザクションには影響ありません。

[TPESYSTEM]

BEA Tuxedo システムのエラーが発生しました。エラーの正確な内容はログ・ファイルに書き込まれます。 キューには影響ありません。

[TPEOS]

オペレーティング・システムのエラーが発生しました。 キューには影響ありません。

[TPEDIAGNOSTIC]

指定されたキューからのメッセージの取り出しが異常終了しました。 異常終了の原因は、TPQUEDEF-REC を介して返される診断値によって判別できます。

診断

次の診断値は、キューからのメッセージの取り出し中に返されます。

[QMEINVAL]

無効な設定が指定されました。

[QMEBADRMID]

無効なリソース・マネージャ識別子が指定されました。

[QMENOTOPEN]

このリソース・マネージャは現在オープンしていません。

[QMETRAN]

呼び出しがトランザクション・モードでない、または TPNOTRAN 設定で呼び出しが行われ、キューからメッセージを取り出すトランザクションの開始を試みた際に、エラーが発生しました。 この診断は、BEA Tuxedo リリース 7.1 以降のキュー・マネージャでは返されません。

[QMEBADMSGID]

キューからの取り出し用に、無効なメッセージ識別子が指定されました。

[QMESYSTEM]

BEA Tuxedo システムのエラーが発生しました。エラーの正確な内容はログ・ファイルに書き込まれます。

[QMEOS]

オペレーティング・システムのエラーが発生しました。

[QMEABORTED]

作業が中途終了しました。 グローバル・トランザクション内で実行された場合、グローバル・トランザクションが中途終了のみになっています。 それ以外の場合、キュー・マネージャは操作を中断しました。

[QMEPROTO]

トランザクション状態がアクティブでないときに、キューからの取り出しが行われました。

[QMEBADQUEUE]

無効な、または削除された、あるいは予約されているキューの名前が指定されました。

[QMENOMSG]

キューから取り出せるメッセージはありません。 なお、メッセージがキュー上に存在し、別のアプリケーション・プロセスが、このメッセージをキューから読み取っていた可能性があることに注意してください。 この場合は、その別のプロセスがトランザクションをロールバックしたときにメッセージはキューに戻されます。

[QMEINUSE]

メッセージ識別子または相関識別子を使用してメッセージをキューから取り出す際に、指定したメッセージは別のトランザクションによって使用されています。 それ以外の場合、現在キューにあるメッセージはすべて、ほかのトランザクションによって使用されています。 この診断は、BEA Tuxedo リリース 7.1 以降のキュー・マネージャでは返されません。

[QMESHARE]

指定されたキューからメッセージを取り出す際に、そのキューが別のアプリケーションによって排他的にオープンされています。 BEA Tuxedo システム以外の BEA 製品ベースのアプリケーションが、キューイング・サービス API (QSAPI) を使用して読み取りおよび書き込みを排他的に行うため、キューをオープンしています。

関連項目

qmadmin(1)TPENQUEUE(3cbl)TMQUEUE(5)

 

先頭へ戻る 前のトピックへ 次のトピックへ