bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

Tuxedo COBOL リファレンス

 Previous Next Contents View as PDF  

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-SVCSUCCTPEV-SVCFAIL などのイベントが TPRETURN() から送られるのを待ってください。

サービス・ルーチンがトランザクション・モードであった場合、TPRETURN() はトランザクションのサービス部分を、そのトランザクションの完了時点でコミットあるいはアボートできる状態にします。サービスは同じトランザクションの一部として複数回呼び出すことができるので、TPCOMMIT() または TPABORT() がそのトランザクションの実行元によって呼び出されるまでは、完全にコミットあるいは中途終了させる必要は必ずしもありません。

TPRETURN() は、該当サービス・ルーチンが開始した要求/応答型サービス要求で期待されるすべての応答を受け取った後で、呼び出すようにしてください。そうでない場合は、サービスの性質に応じて、そのサービス・ルーチンで通信を起動したプログラムに、[TPESVCERR] 状態または TPEV-SVCERR イベントが返されます。受信されていない未終了の応答は、受信後、BEA Tuxedo ATMI のディスパッチャによって自動的に取り除かれます。また、これらの応答に対応する通信ハンドルは無効になります

TPRETURN() は、サービスが開始した接続をすべてクローズしてから呼び出すことも必要です。そうでない場合は、サービスの性質に応じて、そのサービス・ルーチンで通信を起動したプログラムに、[TPESVCERR] 状態または TPEV-SVCERR イベントが返されます。また、即時切断イベント (つまり、TPEV-DISCONIMM) が、オープンしているすべての接続を通して下位サービスに送信されます。

接続の制御に関しては、TPRETURN() 発行時に、サービス・ルーチンがそれが呼び出された接続の制御権を持っていない場合、2 とおりの結果が考えられます。まず、サービス・ルーチンが TPSVCRET-REC 内の TP-RETURN-VALTPFAIL() を、TPTYPE-REC 内の REC-TYPESPACES (つまり、送信データなし) を設定して TPRETURN() を呼び出す場合、TPEV-SVCFAIL イベントがこの会話の起動元に送信されます。あるいは、それ以外の設定で TPRETURN() 呼び出しが行われる場合、TPEV-SVCERR イベントが起動元に送信されます。

会話サービスは、自分が開始していないオープン接続を 1 つだけ持っているので、どの通信ハンドルについてデータ (およびイベント) を送信すればいいかをサーバは認識しています。このため、通信ハンドルは TPRETURN() には渡されません。

次に、TPRETURN() の引数について説明します。TP-RETURN-VAL は次のいずれかに設定できます。

TPSUCCESS

サービスは正常に終了しました。データが存在する場合、そのデータは送られます (戻り処理の失敗の場合を除く)。呼び出し元がトランザクション・モードの場合、TPRETURN() はそのトランザクションの呼び出し元の部分を、トランザクションが最終的にコミットする時点でコミットできるような状態にします。なお、TPRETURN() を呼び出しても、必ずしもトランザクション全体が終了することにはつながりません。また、呼び出し元が正常終了を示したとしても、未処理の応答またはオープンされたままの接続がある場合や、該当サービス内で行われた作業が原因でトランザクションがアボートのみになった場合は、異常終了メッセージが送られます。つまり、応答の受信者は TPESVCERR() 表示あるいは TPEV-SVCERR イベントを受け取ります。なお、サービス・ルーチンの処理中になんらかの理由でトランザクションがアボートのみになると、TP-RETURN-VALTPFAIL() に設定されます。TPSUCCESS() が会話サービスに対して指定されると、 TPEV-SVCSUCC イベントが生成されます。

TPFAIL

アプリケーション上の問題でサービスが異常終了しました。応答を受け取ったプログラムにエラーが報告されます。つまり、応答を受け取る呼び出しは異常終了し、受信側は [TPSVCERR] 指示あるいは TPEV-SVCERR イベントを受け取ります。呼び出し元がトランザクション・モードの場合、TPRETURN() はそのトランザクションをアボートのみにします (ただし、トランザクションは既にアボートのみになっていることもあります)。戻り処理が失敗した場合を除き、呼び出し元のデータが (もしあれば) 送られます。トランザクション・タイムアウトになって、呼び出し元のデータが送られない場合もあります。このケースでは、応答を待つプログラムは [TPETIME] エラーを受け取ることになります。

TPEXIT

この値は、サービスの完了という点では TPFAIL() と同じですが、トランザクションがアボートのみになり応答が要求者に返された後で、サーバは終了します。サーバが再開可能な場合は、自動的に再開します。

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-TYPESPACES の場合、DATA-REC および LEN は無視されます。このとき、サービスを呼び出したプログラムが応答を期待している場合には、応答はデータ部なしで送信されます。応答を期待していない場合、TPRETURN() は渡されたデータをすべて無視し、応答を送信せずに終了します。REC-TYPESTRING で、LEN0 の場合は、要求はデータ部なしで送信されます。

会話サービスの場合、アプリケーションの戻りコードとデータ部が送られないケースがいくつかあります。

戻り値

TPRETURN() には EXIT PROGRAM 文が含まれるので、呼び出し元には値が返されず、制御もサービス・ルーチンには返されません。サービス・ルーチンが TPRETURN() を使用せずに終了すると (つまり、EXIT PROGRAM 文を直接使用するか、単純に「サービス・ルーチンを終了する」と)、サーバはサービス・エラーをサービスの要求者に返します。従属側へのオープン接続はすべてただちに切断され、未終了の非同期応答は取り除かれます。サーバが異常終了時にトランザクション・モードにあった場合は、そのトランザクションには中途終了マークが付けられます。TPRETURN() がサービス・ルーチンとは別に使用される場合 (つまり、サービス・ルーチンでないルーチンによって使用される場合)、TPRETURN() は何の影響も与えません。

エラー

TPRETURN はサービス・ルーチンを終了させるので、引数の処理中またはそのルーチンの処理中に検出されたエラーは、そのルーチンの呼び出し元には示されません。このようなエラーが検出されると、TPCALL() または TPGETRPLY() でサービスからの結果を受信するプログラムについては、TP-STATUS に [TPESVCERR] が設定され、TPSEND() または TPRECV() を使用しているプログラムには、その会話について TPEV-SVCERR イベントが送信されます。

関連項目

TPCALL(3cbl)TPCONNECT(3cbl)TPFORWAR(3cbl)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy