![]() |
![]() |
|
|
サービス・ルーチンの終了
TPRETURN(3cbl)、TPCANCEL(3cbl)、および TPFORWAR(3cbl) ルーチンは、サービス ルーチンが完了したことをそれぞれ次の方法で通知します。
応答の送信
TPRETURN(3cbl) および TPFORWAR(3cbl) 呼び出しは、サービス・ルーチンの終了を示す EXIT 文を含んだ COBOL の copy ファイルです。これらの呼び出しは、それぞれ要求元にメッセージを送信するか、またはほかのサービスに要求を転送します。TPRETURN ルーチンの呼び出しには、次の文法を使用します。
01 TPSVCRET-REC.
COPY TPSVCRET.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY DATA-REC
TPSTATUS-REC BY TPSTATUS-REC.
注記 ここでは、CALL ではなく COPY を使用する必要があります。これにより、EXIT 文が正しく呼び出され、COBOL サービス・ルーチンが BEA Tuxedo システムに制御を戻します。
次のコードは、TPSVCRET-REC レコードの文法を示しています。
05 TPRETURN-VAL PIC S9(9) COMP-5.
88 TPSUCCESS VALUE 0.
88 TPFAIL VALUE 1.
88 TPFAIL VALUE 2.
05 APPL-CODE PIC S9(9) COMP-5.
次の表は、TPSVCRET-REC データ構造体のメンバを示しています。
TPSVCRET-REC データ構造体のメンバ
TPTYPE-REC レコードについては、「サービスの定義」を参照してください。 サービス・ルーチンの主なタスクは、要求を処理してクライアント・プロセスに応答を返すことです。ただし、要求されたタスクを行うために必要なすべての処理を 1 つのサービスで行う必要はありません。サービスは要求元として動作し、クライアントが元の要求を行ったときと同じように、TPCALL または TPACALL を呼び出して、要求呼び出しを別のサービスに渡すことができます。 注記 TPCALL および TPACALL ルーチンの詳細については、「クライアントおよびサーバへの要求/応答のコーディング」を参照してください。 TPRETURN が呼び出された場合、常に制御プログラムに制御が戻ります。非同期応答でサービスが要求を送信している場合、制御プログラムに制御を戻す前にすべての応答を受信するか、または TPCANCEL を使用して既に送信した要求を無効にする必要があります。それ以外の場合、未処理の応答は BEA Tuxedo システムの制御プログラムで受信されると自動的に破棄され、呼び出し元にエラーが返されます。 クライアントが TPCALL を使用してサービスを呼び出した場合、TPRETURN の呼び出しが成功すると、O-DATA-REC レコードから応答メッセージを取得できます。TPACALL を使用して要求を送信し、TPRETURN から正常に制御が戻されると、TPGETRPLY の DATA-REC レコードに応答メッセージが格納されます。 応答が必要な場合に、TPRETURN の引数の処理時にエラーが発生すると、呼び出し元プロセスに失敗を示すメッセージが送信されます。呼び出し元は、TP-STATUS に格納されている値を調べてエラーを検出します。失敗を示すメッセージが送信された場合、TP-STATUS に TPESVCERR が設定されます。この値は、APPL-RETURN-CODE IN TPSTATUS-REC の値よりも優先されます。このようなエラーが発生した場合、応答データは返されず、呼び出し元の出力レコードの内容と長さは変更されません。 TPRETURN が不明なタイプのレコードにメッセージを返すか、または呼び出し元で使用できないレコードにメッセージを返した場合、つまり TPNOCHANGE が設定されて呼び出しが行われた場合、TP-STATUS に TPEOTYPE が返されます。その場合、アプリケーションの成功また失敗は判定されず、呼び出し元の出力レコードの内容と長さは変更されません。 TPRETURN ルーチンが呼び出され、呼び出し元が応答を待っている間にタイムアウトが発生した場合、APPL-RETURN-CODE IN TPSTATUS-REC に返される値は意味を持ちません。この状況は、TP-STATUS に値が返されるどの状況よりも優先します。その場合、TP-STATUS に TPETIME が設定され、応答データは送信されず、呼び出し元の応答レコードの内容と長さは変更されません。BEA Tuxedo システムにはブロッキング・タイムアウトとトランザクション・タイムアウトの 2 種類のタイムアウトがあります。詳細については、「グローバル・トランザクションのコーディング」を参照してください。 ここで示すコード例は、XFER サーバの一部である TRANSFER サービスを示しています。基本的に、TRANSFER サービスは WITHDRAWAL および DEPOSIT サービスへの同期呼び出しを行います。このサービスでは、WITHDRAWAL と DEPOSIT の両サービスの呼び出しに同じ要求レコードを使用する必要があるので、応答メッセージ用に別のレコードが割り当てられます。WITHDRAWAL の呼び出しが失敗した場合、フォーム上のステータス行に「cannot withdraw」というメッセージが出力され、TPRETURN ルーチンの TP-RETURN-VAL IN TPSVCRET-REC に TPFAIL が設定されます。呼び出しが成功した場合、振替元口座の残高が応答レコードから取得されます。 注記 次のコード例では、フィールド化レコード transf 内の ACCOUNT_ID フィールドのゼロ番目のオカレンスに、アプリケーションが cr_id 変数から取得した「振替先口座」の識別子を移動しています。このような移動が必要なのは、FML レコード内のフィールドのこのオカレンスが、データ依存型ルーティングに使用されるからです。詳細については、『BEA Tuxedo アプリケーションの設定』を参照してください。 withdrawal サービス呼び出しのシナリオは、DEPOSIT サービスへの呼び出しにも適用できます。呼び出しが成功すると、このサービスによって TP-RETURN-VAL IN TPSVCRET-REC に TPSUCCESS が設定されて、適切な残高情報がステータス行に返されます。 TPRETURN ルーチン 記述子の無効化 TPGETRPLY を呼び出したサービス (「クライアントおよびサーバへの要求/応答のコーディング」 を参照) が TPETIME で失敗して要求を取り消す場合、TPCANCEL(3cbl) を呼び出して記述子を無効にできます。以降、応答が届いても自動的に破棄されます。 TPCANCEL はトランザクション応答、つまり TPNOTRAN フラグが設定されていない状態で呼び出された要求への応答には使用できません。トランザクション内では、TPABORT(3cbl) がトランザクションの呼び出し記述子を無効にします。 次のコード例は、タイムアウト後の応答を無効にする方法を示しています。 タイムアウト後の応答の無効化 要求の転送 TPFORWAR(3cbl) ルーチンを使用すると、サービス要求をほかのサービスに転送して、別の処理を行うことができます。 TPFORWAR ルーチンの呼び出しには、次の文法を使用します。 TPSVCDEF-REC および TPTYPE-REC レコードについては、「サービスの定義」を参照してください。 TPFORWAR は、サービス呼び出しとは異なります。つまり、要求の転送元サービスでは、応答は要求されていません。応答を返すのは、要求の転送先サービスです。このサービスを転送されたサービスが、要求の発信元プロセスに応答を返します。転送が連鎖的に行われる場合、最後のサーバが TPRETURN を呼び出して、要求の発信元であるクライアントに応答を返します。 次の図は、あるサーバから別のサーバに要求を転送したときのイベントの流れを示しています。この例では、クライアントは TPCALL ルーチンを使用して要求を開始し、連鎖の最後のサービス (サービス C) が TPRETURN ルーチンを使用して応答を返しています。 要求の転送 IDENTIFICATION DIVISION.
PROGRAM-ID. TRANSFER.
AUTHOR.TUXEDO DEVELOPMENT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER.USL-486.
OBJECT-COMPUTER.USL-486.
*
INPUT-OUTPUT SECTION.
. . .
******************************************************
* Tuxedo の定義
******************************************************
01 TPSVCRET-REC.
COPY TPSVCRET.
*
01 TPTYPE-REC.
COPY TPTYPE.
*
01 TPSTATUS-REC.
COPY TPSTATUS.
*
01 TPSVCDEF-REC.
COPY TPSVCDEF.
******************************************************
* ユーザ定義のデータ・レコード
******************************************************
01 TRANS-REC.
COPY TRANS-AMOUNT.
*
LINKAGE SECTION.
*
PROCEDURE DIVISION.
*
START-TRANSFER.
******************************************************
* クライアントから送信されたデータの取得
******************************************************
MOVE LENGTH OF TRANS-REC TO LEN.
CALL "TPSVCSTART" USING TPSVCDEF-REC
TPTYPE-REC
TRANS-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "Transaction Encountered An Error" TO STATUS-LINE
SET TPFAIL TO TRUE.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY TRANS-REC
TPSTATUS-REC BY TPSTATUS-REC.
ELSE
. . . Check other parameters
******************************************************
* 振替元と振替先の口座番号が有効かどうかを確認します。
******************************************************
CALL "FIND-ACCOUNT-FUNCTION" USING TRANS-DEBIT-ACCOUNT IN TRANS-REC.
IF TRANS-DEBIT-ACCOUNT is not valid
MOVE "Invalid Debit Account Number"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
CALL "FIND-ACCOUNT-FUNCTION" USING TRANS-CREDIT-ACCOUNT IN TRANS-REC.
IF TRANS-CREDIT-ACCOUNT is not valid
MOVE "Invalid Credit Account Number"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* 振替金額を確認します。
******************************************************
IF TRANS-AMOUNT IN TRANS-REC < 0 MOVE "Invalid Transfer Amount Requested"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* 別のサービスを使用して Withdrawal を実行します。
******************************************************
MOVE "WITHDRAWAL" TO SERVICE-NAME.
. . . set other TPCALL parameters
CALL "TPCALL" USING . . .
IF NOT TPOK
MOVE "Cannot withdraw from debit account"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* 別のサービスを使用して Deposit を実行します。
******************************************************
MOVE "DEPOSIT" TO SERVICE-NAME.
. . . set other TPCALL parameters
CALL "TPCALL" USING . . .
IF NOT TPOK
MOVE "Cannot Deposit into credit account"
TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
. . .
MOVE "Transfer completed" TO STATUS-LINE IN TRANS-REC
. . . MOVE all the data into TRANS-REC needed by the client
SET TPSUCCESS TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.. . . Set up parameters to TPACALL
SET TPNOTRAN TO TRUE.
CALL "TPACALL" USING TPSVCDEF-REC
TPTYPE-REC
DEBIT-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
. . .
CALL "TPGETRPLY" USING TPSVCDEF-REC
TPTYPE-REC
DEBIT-REC
TPSTATUS-REC.
IF NOT TPOK
error processing
IF TPETIME
CALL "TPCANCEL" TPSVCDEF-REC
TPSTATUS-REC.
. . .
SET TPSUCCESS TO TRUE.
COPY TPRETURN REPLACING TPSVCRET-REC BY TPSVCRET-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY DEBIT-REC
TPSTATUS-REC BY TPSTATUS-REC. 01 TPSVCDEF-REC.
COPY TPSVCDEF.
01 TPTYPE-REC.
COPY TPTYPE.
01 DATA-REC.
COPY User Data.
01 TPSTATUS-REC.
COPY TPSTATUS.
COPY TPFORWAR REPLACING TPSVCDEF-REC BY TPSVCDEF-REC
TPTYPE-REC BY TPTYPE-REC
DATA-REC BY DATA-REC
TPSTATUS-REC BY TPSTATUS-REC.
サービス・ルーチンは TPSPRIO ルーチンを使用して、クライアント・プロセスが要求を送るのと同じように、指定された優先順位に従って要求を転送できます。 プロセスが TPFORWAR を呼び出すと、システムで提供された制御プログラムに制御が戻り、サーバ・プロセスは別の要求を処理できるようになります。 注記 クライアントとして動作するサーバ・プロセスが応答を要求する場合、このサーバが自分自身からサービスを要求することはできません。つまり、必要なサービスの唯一のインスタンスが要求を行っているサーバ・プロセスからのみ提供される場合、その呼び出しは失敗して再帰呼び出しができないことが示されます。ただし、TPNOREPLY 通信フラグが設定された状態でサービス・ルーチンが自分宛てに要求を送信または転送した場合、サービスは自分からの応答を待機しないので、呼び出しは失敗しません。 TPFORWAR 呼び出しを使用して、その呼び出しを行った時点まで要求の処理が成功していたことを示すことができます。アプリケーション・エラーが検出されなかった場合、TPFORWAR を呼び出します。エラーが検出された場合、TP-RETURN-VAL IN TPSVCRET-REC に TPFAIL を設定して TPRETURN を呼び出します。 次のコード例は、TPFORWAR を呼び出して、サービスがそのデータ・レコードを DEPOSIT サービスに送る方法を示しています。新規口座の追加が成功した場合、支店レコードが更新されてその口座が反映され、データ・レコードが DEPOSIT サービスに転送されます。失敗した場合、TP-RETURN-VAL IN TPSVCRET-REC に TPFAIL が設定されて TPRETURN が呼び出され、失敗を示すメッセージがフォーム上のステータス行に出力されます。 TPFORWAR の使用方法 . . .
******************************************************
* クライアントから送信されたデータの取得
******************************************************
MOVE LENGTH OF TRANS-REC TO LEN.
CALL "TPSVCSTART" USING TPSVCDEF-REC
TPTYPE-REC
TRANS-REC
TPSTATUS-REC.
IF NOT TPOK
MOVE "Transaction Encountered An Error" TO STATUS-LINE
SET TPFAIL TO TRUE.
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
ELSE
. . . Check other parameters
******************************************************
* 新規の口座レコードの挿入
******************************************************
CALL "ADD-NEW-ACCOUNT-FUNCTION" USING TRANS-ACCOUNT IN TRANS-REC.
IF Adding New Account Failed
MOVE "Account not added" TO STATUS-LINE IN TRANS-REC
SET TPFAIL TO TRUE
COPY TPRETURN REPLACING
DATA-REC BY TRANS-REC.
******************************************************
* レコードを DEPOSIT サービスに転送して、
* 初期残高を口座に追加
******************************************************
MOVE "DEPOSIT" TO SERVICE-NAME.
. . . set other TPFORWAR parameters
COPY TPFORWAR REPLACING
DATA-REC BY TRANS-REC.
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|