BEA Logo BEA Tuxedo Release 8.0

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

 

   Tuxedo ホーム   |   BEA Tuxedo /Q コンポーネント   |   先頭へ   |   前へ   |   次へ   |   目次

 


メッセージのキューからの取り出し

次は、TPDEQUEUE() の構文です。

01 TPQUEDEF-REC.
COPY TPQUEDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
CALL "TPDEQUEUE" USING TPQUEDEF-REC TPTYPE-REC DATA-REC TPSTATUS-REC.

この呼び出しが行われると、TPQUEDEF-REC 内の QSPACE-NAME で指定されたキュー・スペースの TPQUEDEF-REC の QNAME キューからメッセージを取り出すようにシステムが指示されます。メッセージは、DATA-REC に挿入されます。TPTYPE-REC の LEN にデータ長が設定されます。TPDEQUEUE() から返された LEN が 0 の場合、そのメッセージにはデータ部がないことを示します。TPQUEDEF-REC の設定によって、システムに TPDEQUEUE() 呼び出しの処理方法が通知されます。

TPDEQUEUE() の引数

TPDEQUEUE(3cbl) の処理を制御するいくつかの重要な引数があります。その一部について、以下に説明します。

TPDEQUEUE():TPQUEDEF-REC 引数内の QSPACE-NAME

QSPACE-NAME は、管理者によって既に作成されたキュー・スペースを識別します。TMQUEUE サーバがコンフィギュレーション・ファイルの SERVERS セクションで定義されている場合、そのサーバが提供するサービス名は、実際のキュー・スペース名 (GROUPS セクションの OPENINFO パラメータの一部として指定されます) のエイリアスになります。たとえば、アプリケーションがサーバ TMQUEUE を使用する場合、QSPACE-NAME 引数が指す値は、TMQUEUE が宣言するサービス名になります。サービスのエイリアスが何も定義されていない場合、デフォルトのサービス名は TMQUEUE サーバと同じエイリアスになります。その場合、コンフィギュレーション・ファイルには次の内容が記述されています。

TMQUEUE 
SRVGRP = QUE1 SRVID = 1 
GRACE = 0 RESTART = Y CONV = N 
CLOPT = "-A"
または
CLOPT = "-s TMQUEUE" 

サーバ・グループ QUE1 のエントリには、OPENINFO パラメータを使用して、リソース・マネージャ、デバイスのパス名、およびキュー・スペース名を指定します。クライアント・プログラムにおける QSPACE-NAME 引数は、次のように記述されます。

  01 TPQUEDEF-REC. 
COPY TPQUEDEF. 
01 TPTYPE-REC. 
COPY TPTYPE. 
01 TPSTATUS-REC. 
COPY TPSTATUS. 
01 USER-DATA-REC PIC X(100). 
* 
* 
* 
MOVE LOW-VALUES TO TPQUEDEF-REC. 
MOVE "TMQUEUE" TO QSPACE-NAME IN TPQUEDEF-REC. 
MOVE "REPLYQ" TO QNAME IN TPQUEDEF-REC. 
SET TPTRAN IN TPQUEDEF-REC TO TRUE. 
SET TPBLOCK IN TPQUEDEF-REC TO TRUE. 
SET TPTIME IN TPQUEDEF-REC TO TRUE. 
SET TPSIGRSTRT IN TPQUEDEF-REC TO TRUE. 
MOVE LOW-VALUES TO TPTYPE-REC. 
MOVE "STRING" TO REC-TYPE IN TPTYPE-REC. 
MOVE LENGTH OF USER-DATA-REC TO LEN IN TPTYPE-REC. 
CALL "TPDEQUEUE" USING 
TPQUEDEF-REC 
TPTYPE-REC 
USER-DATA-REC 
TPSTATUS-REC.

TMQUEUE(5) リファレンス・ページの例では、サーバを作成してコンフィギュレーション・ファイルで指定する際に、サービスのエイリアスを指定する方法が示されています。「サンプル・アプリケーション」 のサンプル・プログラムでも、サービスのエイリアスが指定されています。

TPDEQUEUE():TPQUEDEF-REC 引数内の QNAME

キュー・スペース内のキュー名は、そのキュー・スペースにアクセスするアプリケーション間で一貫していなければなりません。これは、応答キューでは特に重要です。QNAME が応答キューを参照する場合、管理者はほかのキューと同じ方法で応答キュー、そして多くの場合、エラー・キューも作成します。QNAME には、メッセージまたは応答を取り出すキューの名前が指定されています。

TPDEQUEUE():DATA-REC および TPTYPE-REC 引数内の LEN

この引数は、TPENQUEUE() で使用される場合と若干意味が異なります。DATA-REC は、キューから取り出されたメッセージをシステムが格納する場所を示します。

入力として LEN に 0 が設定されている場合はエラーになります。TPDEQUEUE() が戻ると、LEN には取り出されたデータの長さが格納されます。0 は応答にデータがなかったことを示します。アプリケーションによっては、これは正当で正常な応答です。長さ 0 の応答を受信した場合でも、それをキューに登録された要求の正常処理を示すために使用できます。レコードが TPDEQUEUE() 呼び出しの前と比べて変更されているかどうかを確認する場合は、TPDEQUEUE() 呼び出しの前にデータ長を保存し、それを呼び出しが終了した後で LEN と比較します。応答が LEN より長い場合、DATA-REC にはこのレコードに格納できるだけのバイト数が挿入されます。それを超える部分は破棄され、TPTRUNCATE が設定されて TPDEQUEUE() は失敗します。

TPDEQUEUE():TPQUEDEF-REC の設定値

TPQUEDEF-REC の設定値は、TPDEQUEUE() 呼び出しの処理方法を BEA Tuxedoシステムに通知するために使用されます。次は、有効な設定です。

TPNOTRAN

呼び出し元がトランザクション・モードにある場合、この設定はキューからのメッセージの取り出しが別のトランザクション内で行われることを指示します。TPNOTRAN または TPTRAN のいずれかを設定しなければなりません。

TPTRAN

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

TPNOBLOCK

ブロッキング状態が存在する場合、メッセージはキューから取り出されません。TPNOBLOCK が設定されている場合に、メッセージの転送先である内部バッファがいっぱいであるなどのブロッキング状態が存在すると、呼び出しは失敗し、tperrno(5)TPEBLOCK が設定されます。TPNOBLOCK が設定されている場合に、ターゲットのキューが別のアプリケーションによって排他的にオープンされているというブロッキング状態が存在すると、呼び出しは失敗し、tperrno()TPEDIAGNOSTIC が設定され、TPQCTL 構造体の診断フィールドに QMESHARE が設定されます。後者の場合、BEA Tuxedo システム以外の BEA 製品に基づくほかのアプリケーションが、キューイング・サービス API (QSAPI) を使用して読み取りと書き込み、またはそのいずれかを排他的に行うためにキューをオープンしています。TPNOBLOCK または TPBLOCK のいずれかを設定しなければなりません。

TPBLOCK

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

TPNOTIME

この値が設定されていると、呼び出しにブロッキング・タイムアウトが適用されないことを示します。ただし、トランザクション・タイムアウトは発生する可能性があります。TPNOTIME または TPTIME のいずれかを設定しなければなりません。

TPTIME

この値が設定されていると、呼び出しにブロッキング・タイムアウトが適用されることを示します。TPNOTIME または TPTIME のいずれかを設定しなければなりません。

TPNOCHANGE

この値が設定されていると、DATA-REC のレコード・タイプは変更できません。つまり、受信したレコードのタイプおよびサブタイプは、レコード DATA-REC のタイプおよびサブタイプと一致しなければなりません。TPNOCHANGE または TPCHANGE のいずれかを設定しなければなりません。

TPCHANGE

デフォルトでは、レコード DATA-REC とは異なるタイプのレコードが受信されると、受信側が着信レコードのタイプを識別する限り、DATA-REC のレコード・タイプは、受信されたレコードのタイプに変更されます。つまり、受信したレコードのタイプおよびサブタイプは、レコード DATA-REC のタイプおよびサブタイプと一致しなければなりません。TPNOCHANGE または TPCHANGE のいずれかを設定しなければなりません。

TPSIGRSTRT

この値が設定されていると、基となるシステム・コールがシグナルによって中断された場合、中断されたシステム・コールが再度呼び出されることを指定します。TPSIGRSTRT または TPNOSIGRSTRT のいずれかを設定しなければなりません。

TPNOSIGRSTRT

この値が設定されている場合にシグナルが受信されると、呼び出しは失敗し、TP-STATUSTPEGOTSIG が設定されます。TPSIGRSTRT または TPNOSIGRSTRT のいずれかを設定しなければなりません。

TPQUEDEF-REC 構造体

TPDEQUEUE() の最初の引数は、TPQUEDEF-REC 構造体です。TPQUEDEF-REC 構造体には、アプリケーションで使用されるメンバと BEA Tuxedo システムで使用されるメンバがあり、アプリケーション・プログラムとキュー機能間の両方向でパラメータがやり取りされます。TPDEQUEUE() を呼び出すクライアントは、設定値を使用して、システム側で入力する必要のあるメンバをマークします。前述のように、この構造体は TPENQUEUE() でも使用されます。一部のメンバは、TPENQUEUE() だけに適用されます。この構造体全体のコード例は、「TPQUEDEF-REC 構造体」 に示されています。

TPDEQUEUE() への入力では、次のフィールドを TPQUEDEF 構造体に設定します。

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

次は、TPDEQUEUE() の入力情報を制御する TPQUEDEF-REC の有効な値です。

TPQGETNEXT

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

TPQGETBYMSGID

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

TPQGETNEXTTPQGETBYMSGIDTPQGETBYCORRID のいずれかを設定しなければなりません。

TPQGETBYCORRID

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

TPQGETNEXTTPQGETBYMSGIDTPQGETBYCORRID のいずれかを設定しなければなりません。

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 以内の範囲内で、数値が高いほど優先順位も高くなります。つまり、高い数値のメッセージが低い数値のメッセージよりも先にキューから取り出されます。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 に返されます。DIAGNOSTIC の有効な設定値には、「TPQUEDEF-REC 構造体」 に示されている TPENQUEUE() の値 (QMENOSPACEQMERELEASE を除く) のほかに、次のものがあります。

[QMENOMSG]

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

[QMEINUSE]

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

TPQWAIT の使用

フラグに TPQWAIT を設定して TPDEQUEUE() を呼び出すと、メッセージをすぐに取り出すことができない場合、TPDEQUEUE() が制御を呼び出し元に返す前に、TMQUEUE サーバは TPDEQUEUE() 要求に一致するメッセージがキューに到着するのを待ちます。TMQUEUE プロセスは待機中の要求を無視し、ほかのプロセスの要求を処理しながら、最初の要求の条件が満たされるのを待ちます。TPQGETBYMSGIDTPQGETBYCORRID も指定されている場合、サーバは指定されたメッセージ識別子や相関識別子を持つメッセージをキューから取り出せるようになるまで待ちます。このどちらのフラグも設定されていない場合、サーバは任意のメッセージがキューに登録されるまで待ちます。呼び出しがトランザクション・モードの場合、サーバの待機時間は、呼び出し元のトランザクション・タイムアウトによって制御されます。呼び出しがトランザクション・モードでない場合、TMQUEUE サーバの CLOPT パラメータに指定される -t オプションで制御されます。

TMQUEUE サーバは、要求を処理するアクション・リソースを利用できる限り、複数の待機中 TPDEQUEUE() 要求を同時に処理できます。十分なアクション・リソースがキュー・スペースに対して設定されていない場合、TPDEQUEUE() は失敗します。使用しているシステムがこれに該当する場合は、キュー・スペースに対するアクション・リソースの数を増やしてください。

TMQFORWARD サービス使用時のエラー処理

キューからのメッセージの取り出しで、エラー処理の最良の方法を考慮する場合、次の 2 種類のエラーを区別しておきます。

デフォルトでは、メッセージがトランザクション内でキューから取り出され、そのトランザクションがロールバックされると、そのメッセージはキューに戻されて、再度キューからの取り出しと実行が可能になります。一時的な障害が解消されるように (たとえば、データベースのロックを別のトランザクションが解除するように) 少し時間をおいてから、メッセージの取り出しと実行を再度試みます。通常、再試行の回数に上限を設定することも、アプリケーション不備によってリソースを著しく浪費することを防ぐために有用です。管理者がキューを設定するときに、再試行の回数と遅延時間 (秒単位) の両方を指定できます。再試行の回数 0 は、再試行が行われないことを示します。再試行の回数が上限に達すると、管理者がキュー・スペースに設定するエラー・キューにメッセージが移動されます。エラー・キューが設定されていない場合、再試行回数の上限に達したメッセージは単に削除されます。エラー・キューにあるメッセージは、管理者によって処理されなければなりません。管理者は、アプリケーションの要件を満たす方法で発信元に通知する必要があります。選択されたメッセージ処理方法は、メッセージをキューに登録した発信元プログラムにほとんど透過的です。メッセージは一度正常にキューに登録されると、TPENQUEUE() のパラメータおよびキューの属性に従って処理されることが実質的には保証されます。メッセージがエラー・キューに移動されたことの通知は、キューのパラメータを適切に調整されたシステムではほとんどありません。

異常終了キュー (通常、キュー・スペースのエラー・キューとは異なります) は、キューに登録された各メッセージと対応付けられます。このキューは、異常終了メッセージを置く場所として、キューにメッセージを登録する呼び出しで指定されます。特定の要求に対する異常終了メッセージは、アプリケーション生成の相関識別子で識別できます。相関識別子は、キューにメッセージを登録するときに、そのメッセージと対応付けられます。

成功するまで (または事前に定義された回数まで) 再試行を繰り返すというデフォルトの動作は、時間が経過すれば解決されるような一時的な障害が失敗の原因であり、メッセージが後から適切に処理される場合は適しています。

障害が一時的なものではない場合もあります。たとえば、存在しないアカウントでの操作を要求するメッセージがキューに入れられている場合 (アプリケーションも適当な時間に存在していない場合) です。その場合、再試行してリソースを浪費しないようにします。アプリケーション・プログラマまたは管理者が、特定の操作の失敗が一時的ではないと判断した場合、単に再試行回数を 0 に設定します。ただし、この場合、このようなメッセージが入るキュー・スペースのエラー・キューを継続的にクリアするメカニズム (キューを定期的に読み取るバックグラウンドのクライアントなど) が必要です。また、同じサービスに対する障害でも、一時的なもの (データベース・ロックの競合など) であったり、永続的なもの (アカウントが存在しないなど) であったりする場合が多くあります。

メッセージが TMQFORWARD によって処理される (キューから取り出され、TPCALL を介してアプリケーションに渡される) 場合、TPCALL が返す情報には、TPESVCFAIL エラーが一時的な障害と永続的な障害のどちらによって生じたものであるかを示すメカニズムはありません。

キューからの取り出しをアプリケーションが処理する場合、簡単な解決方法はたとえ操作が失敗しても、そのサービスに対して成功を返すことです。つまり、TPSUCCESS を設定して TPRETURN を実行します。これにより、トランザクションはコミット可能になり、メッセージはキューから削除されます。応答メッセージが使用されている場合、サービスから返されるバッファの情報によって操作の失敗を示すことができ、メッセージが応答キューに登録されます。TPRETURNTPSVCRET-REC 引数内の APPL-CODE も、アプリケーション固有の情報を返すために使用できます。

サービスが失敗し、トランザクションをロールバックする必要がある場合、TMQFORWARD が処理をそれ以上行わずに、2 番目のトランザクションを実行してキューからメッセージを削除するかどうかは明確ではありません。デフォルトでは、TMQFORWARD は失敗したサービスに対するメッセージを削除しません。TMQFORWARD のトランザクションはロールバックされ、メッセージはキューに格納されます。TMQFORWARD にコマンド行オプションを指定すると、サービスが失敗して 0 より長い応答メッセージが返された場合に、メッセージがキューから削除されます。メッセージは、2 番目のトランザクションで削除されます。この処理を行うには、キューに遅延時間および再試行回数を設定する必要があります。メッセージが異常終了キューに対応付けられている場合、メッセージがキューから削除されたトランザクションと同じトランザクションで、応答データが異常終了キューに登録されます。

TMQFORWARD を通して呼び出されたサービスからの応答をキューから取り出す手順

アプリケーションがキューに登録されたメッセージに対する応答を要求している場合、次の手順に従います。

  1. 前提条件として、キュー・スペースに応答キューおよび異常終了キューがあるこ とが必要です。アプリケーションは、相関識別子の内容について一貫していなけ ればなりません。サービスは、論理的な失敗の場合に TPSUCCESS を返し、 TPRETURNTPSVCRET-REC 引数内の APPL-CODE に情報を示すコードを返すよ うにコーディングします。

  2. TPENQUEUE() を呼び出してキューにメッセージを登録する際に、次を設定しま す。
       TPQCORRID          TPQREPLYQ 
    TPQFAILUREQ TPQMSGID

    この呼び出しを行う前に、CORRIDREPLYQUEUE、および FAILUREQUEUE の値を設定します。呼び出しから制御が戻ったら、CORRID を保存します。

  3. TPDEQUEUE() を呼び出して応答を確認する際に、QNAME に応答キューを指定し、 次を設定します。
       TPQCORRID          TPQREPLYQ 
    TPQFAILUREQ TPQMSGID 
    TPQGETBYCORRID

    この呼び出しを行う前に、保存した相関識別子を使用して CORRID に入力します。TPDEQUEUE() の呼び出しが失敗し、TP-STATUSTPEDIAGNOSTIC が設定された場合、詳しい情報を DIAGNOSTIC から取得できます。エラー・コード QMENOMSG を受信した場合、キューから取り出すことのできるメッセージがなかったことを示します。

  4. もう 1 つの TPDEQUEUE() 呼び出しを設定します。この呼び出しでは、QNAME が異 常終了キューの名前を指すようにし、次を設定します。
       TPQCORRID          TPQREPLYQ 
    TPQFAILUREQ TPQMSGID 
    TPQGETBYCORRID

    TPQCORRID に相関識別子を挿入します。呼び出しから制御が戻ったら、LEN を確認してデータを受信したかどうかを確認し、APPL-RETURN-CODE を調べてサービスがユーザ戻り値を返したどうかを確認します。

 

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