![]() |
![]() |
|
|
TPRETURN(3cbl)
名前
TPRETURN() - BEA Tuxedo ATMI のサービス・ルーチンからのリターン
形式
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 T
PSTATUS-REC BY TPSTATUS-REC.
機能説明
TPRETURN() は、サービス・ルーチンが完了したことを示します。 TPRETURN() には EXIT PROGRAM 文が含まれるので、BEA Tuxedo ATMI のディスパッチャに制御を確実に正しく返すために、TPRETURN()はそれが起動されたルーチンと同じルーチンの中から呼び出されなければなりません。つまり、TPRETURN() をサービス・ルーチンのサブ・プログラムから呼び出してはなりません。制御が BEA Tuxedo ATMI のディスパッチャに返されないからです。
TPRETURN() はサービスの応答メッセージを送るときに使用します。 応答を受け取るサービスが TPCALL()、TPGETRPLY()、または TPRECV() で待機している場合、TPRETURN() の呼び出しが成功した時点で、受信側のレコードに応答が入ります。
会話サービスの場合、TPRETURN() は接続自体も切断します。 したがって、サービス・ルーチンは、TPDISCON() を直接呼び出すことができません。 正しい結果を確実に得るためには、会話サービスに接続しているプログラムは、TPDISCON() を呼び出してはなりません。その代わり、会話サービスが完了したことを示す通知を待ってください。つまり、TPEV-SVCSUCC や TPEV-SVCFAIL などのイベントが TPRETURN() から送られるのを待ってください。
サービス・ルーチンがトランザクション・モードであった場合、TPRETURN() はトランザクションのサービス部分を、そのトランザクションの完了時点でコミットあるいはアボートできる状態にします。 サービスは同じトランザクションの一部として複数回呼び出すことができるので、TPCOMMIT() または TPABORT() がそのトランザクションの実行元によって呼び出されるまでは、完全にコミットあるいは中途終了させる必要は必ずしもありません。
TPRETURN() は、該当サービス・ルーチンが開始した要求/応答型サービス要求で期待されるすべての応答を受け取った後で、呼び出すようにしてください。 そうでない場合は、サービスの性質に応じて、そのサービス・ルーチンで通信を起動したプログラムに、[TPESVCERR] 状態または TPEV-SVCERR イベントが返されます。 受信されていない未終了の応答は、受信後、BEA Tuxedo ATMI のディスパッチャによって自動的に取り除かれます。 また、これらの応答に対応する通信ハンドルは無効になります
TPRETURN() は、サービスが開始した接続をすべてクローズしてから呼び出すことも必要です。 そうでない場合は、サービスの性質に応じて、そのサービス・ルーチンで通信を起動したプログラムに、[TPESVCERR] 状態または TPEV-SVCERR イベントが返されます。 また、即時切断イベント (つまり、TPEV-DISCONIMM) が、オープンしているすべての接続を通して下位サービスに送信されます。
接続の制御に関しては、TPRETURN() 発行時に、サービス・ルーチンがそれが呼び出された接続の制御権を持っていない場合、2 とおりの結果が考えられます。まず、サービス・ルーチンが TPSVCRET-REC 内の TP-RETURN-VAL に TPFAIL() を、TPTYPE-REC 内の REC-TYPE に SPACES (つまり、送信データなし) を設定して TPRETURN() を呼び出す場合、TPEV-SVCFAIL イベントがこの会話の起動元に送信されます。 あるいは、それ以外の設定で TPRETURN() 呼び出しが行われる場合、TPEV-SVCERR イベントが起動元に送信されます。
会話サービスは、自分が開始していないオープン接続を 1 つだけ持っているので、どの通信ハンドルについてデータ (およびイベント) を送信すればいいかをサーバは認識しています。 このため、通信ハンドルは TPRETURN() には渡されません。
次に、TPRETURN() の引数について説明します。 TP-RETURN-VAL は次のいずれかに設定できます。
TP-RETURN-VAL がこれらの 3 つの値のいずれかに設定されない場合、デフォルトで TPFAIL() が使用されます。
アプリケーションが定義した戻り値 TPSVCRET-REC 内の APPL-CODE を、サービスの応答を受け取るプログラムに送ることもできます。 このコードは、応答を正常に送ることができれば (つまり、受信の呼び出しが正常に行われるか [TPESVCFAIL] が返される、あるいはイベント TPEV-SVCSUCC または TPEV-SVCFAIL のいずれかが受信されれば)、TP-RETURN-VAL の設定に関係なく送られます。 APPL-CODE の値は、受信側の変数 TPSTATUS-REC 内の APPL-RETURN-CODE に入ります。
DATA-REC は送信されるレコードであり、LEN は、送信する DATA-REC の大きさを指定します。 ただし、DATA-REC が長さの指定を必要としないタイプおよびサブタイプのレコードである場合、LEN は無視されます (0 でかまいません)。 REC-TYPE が SPACES の場合、DATA-REC および LEN は無視されます。 このとき、サービスを呼び出したプログラムが応答を期待している場合には、応答はデータ部なしで送信されます。 応答を期待していない場合、TPRETURN() は渡されたデータをすべて無視し、応答を送信せずに終了します。 REC-TYPE が STRING で、LEN が 0 の場合は、要求はデータ部なしで送信されます。
会話サービスの場合、アプリケーションの戻りコードとデータ部が送られないケースがいくつかあります。
戻り値
TPRETURN() には EXIT PROGRAM 文が含まれるので、呼び出し元には値が返されず、制御もサービス・ルーチンには返されません。 サービス・ルーチンが TPRETURN() を使用せずに終了すると (つまり、EXIT PROGRAM 文を直接使用するか、単純に「サービス・ルーチンを終了する」と)、サーバはサービス・エラーをサービスの要求者に返します。 また、従属側へのオープン接続はすべてただちに切断され、未終了の非同期応答は取り除かれます。 サーバが異常終了時にトランザクション・モードにあった場合は、そのトランザクションには中途終了マークが付けられます。 TPRETURN() がサービス・ルーチンとは別に使用される場合 (つまり、サービス・ルーチンでないルーチンによって使用される場合)、TPRETURN() は何の影響も与えません。
エラー
TPRETURN はサービス・ルーチンを終了させるので、引数の処理中またはそのルーチンの処理中に検出されたエラーは、そのルーチンの呼び出し元には示されません。このようなエラーが検出されると、TPCALL() または TPGETRPLY() でサービスからの結果を受信するプログラムについては、TP-STATUS に [TPESVCERR] が設定され、TPSEND() または TPRECV() を使用しているプログラムには、その会話について TPEV-SVCERR イベントが送信されます。
関連項目
TPCALL(3cbl)、TPCONNECT(3cbl)、TPFORWAR(3cbl)
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|