Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス COBOL言語編


TPRETURN

〈このページの構成〉

名称

サービスルーチンからのリターン

形式

01 TPSVCRET-REC.
   COPY  TPSVCRET.
01 TPTYPE-REC.
   COPY  TPTYPE.
01 DATA-REC.
   COPY  Data record definition.
 
COPY TPRETURN 〔REPLACING TPSVCRET-REC BY TPSVCRET-REC〕
              〔REPLACING TPTYPE-REC BY TPTYPE-REC〕
              〔REPLACING DATA-REC BY DATA-REC〕.

機能

TPRETURNは,サービスルーチンが完了したことを示します。TPRETURNはファイルで,サービスで実行されるCOBOLのコードの最後を含みます。このファイルには,次に示す三つの参照情報が含まれています。TPSVCRET-REC,TPTYPE-REC,およびDATA-RECは,サービスで有効に使われるレコード名に置き換わります。TPRETURNはEXIT PROGRAM文を含んでいるため,制御がコミュニケーションリソースマネジャへ返されるようにコミュニケーションリソースマネジャで呼び出された同じルーチンで実行される必要があります(つまり,制御がコミュニケーションリソースマネジャへ返らないので,TPRETURNはサービスルーチンのサブプログラムで呼び出さないようにしてください)。

TPRETURNは,サービスの応答メッセージを送信するために使います。TPRETURNが成功すると,TPCALL,TPGETRPLY,TPRECVで受信待ちしているプログラムのレコードに応答が返ります。

会話型サービスでは,TPRETURNはコネクションも終了させます。つまり,サービスルーチンは,TPDISCONを直接呼べません。正しい結果を保証するために,会話型サービスと通信しているプログラムは,TPDISCONを呼ばないでください。むしろ,会話型サービスが完了する通知を待ってください(つまり,TPRETURNから送信されたTPEV-SVCSUCCかTPEV-SVCFAILのようなイベントを待つ必要があります)。

サービスルーチンがトランザクションモードの場合は,TPRETURNは,トランザクションが完了したときに,そのサービスをコミットするかロールバックするかを決定します。サービスは,同じトランザクションの一部として複数回呼び出されるので,トランザクションのオリジネータからTXCOMMIT,TXROLLBACKが呼ばれるまで,必ずしも完全にコミット,またはロールバックされるとは限りません。

TPRETURNは,サービスルーチンから起動されたサービス要求からのすべての応答を受信したあとで呼んでください。そうでない場合は,サービスの性質に従って,サービスルーチンとの会話を開始したプログラムにTPESVCERRまたはイベントTPEV-SVCERRがリターンされます。どのような未処理の応答も,受信されていなければ,コミュニケーションリソースマネジャで自動的に捨てられます。さらに,これらの通信ハンドルは,無効になります。

TPRETURNは,サービスで開始されたすべてのコネクションがクローズされてから呼んでください。そうでない場合は,サービスの性質に従って,サービスルーチンとの会話を開始したプログラムにTPESVCERRまたはイベントTPEV-SVCERRがリターンされます。さらに,緊急のコネクション切断イベント(TPEV-DISCONIMM)が,オープンコネクションに該当するすべてのオープンコネクションに送信されます。

コネクション制御に関して,TPRETURNを呼び出したサービスルーチンが,このサービスルーチンを呼び出したコネクションの制御権を持たない場合は,二つの結果が起こることが考えられます。一つ目は,もしサービスルーチンが,TP-RETURN-VAL(TPSVCRET-RECの)にTPFAILを設定,REC-TYPE(TPTYPE-RECの)にSPACES(空白)を設定したTPRETURNを呼ぶ(つまり,データ部は送信されない)と,TPEV-SVCFAILイベントが会話のオリジネータへ送信されます。二つ目は,ほかの値を設定したTPRETURNを呼ぶと,TPEV-SVCERRイベントがオリジネータへ送信されます。

会話型サービスは,開始していないオープンコネクションを一つだけしか持っていないので,コミュニケーションリソースマネジャは,送信された通信ハンドルのデータ(または,イベント)を認識しています。これらの理由で,通信ハンドルはTPRETURNに渡されません。

『データ領域』

『●TPSVCRET-REC

TP-RETURN-VALとAPPL-CODEを設定します。』

『●TPTYPE-REC

送信データのレコードの型と,subtypeのレコード名を示します。』

『●DATA-REC

送信データを示します。』

TPRETURNの引数を次に示します。TP-RETURN-VALには,次に示す値のうち一つが設定されます。

TPSUCCESS

サービスが成功して終了しました。データがある場合は,そのデータも送信されます(リターン処理中で失敗がなければ)。呼び出し側がトランザクションモードである場合は,TPRETURNは,そのサービスを最終的にコミットすることを決定します。

Note:TPRETURNは,必ずしもトランザクション全体を決着する訳ではありません。また,呼び出し側が成功を示しているときでも,未解決の応答やオープンコネクションがあるときや,サービスの中でトランザクションがrollback_only状態となるような何らかの処理をしていた場合,エラーメッセージが送信されます(つまり,応答の受け取り側は,TPESVCERRまたはイベントTPEV-SVCERRを受信します)。

Note:何らかの理由で,トランザクションがサービスルーチンでrollback_only状態になる場合は,TP-RETURN-VALにはTPFAILを設定してください。会話型サービスにTPSUCCESSが設定されていた場合は,イベントTPEV-SVCSUCCが通知されます。

TPFAIL

サービスがアプリケーションの立場から見て不成功に終了しました。エラーは応答を受信するプログラムに送信されます。つまり,応答を受信する呼び出しは失敗して,受け取り側はTPESVCFAILまたはイベントTPEV-SVCFAILを受信します。呼び出し側がトランザクションモードである場合は,TPRETURNはトランザクションをrollback_only状態にします(Note:トランザクションはすでにrollback_only状態になっているかもしれません)。リターンの処理中で失敗がなければ,呼び出し側のデータがある場合は,送信されます。呼び出し側のデータが送信されない理由の一つは,トランザクションタイムアウトが起こったときです。この場合,応答を待っているプログラムは,TPETIMEのエラーを受信します。

TP-RETURN-VALに二つのうちのどちらでもない値が設定されている場合は,TPFAILと見なされます。

アプリケーションで定義したリターンコードであるAPPL-CODE(TPSVCRET-RECの)は,サービスの応答を受信するプログラムへ送信されます。このコードは,応答が正常に送信されている限り,TP-RETURN-VALに設定した内容に関係なく送信されます(つまり,呼び出しの受信で成功が返るか,TPESVCFAILをリターンするか,TPEV-SVCSUCCまたはTPEV-SVCFAILのイベントのうちの一つを受信する限り)。会話型サービスでは,APPL-CODEの値は,受け取り側のTP-STATUS-RECのAPPL-RETURN-CODEとして有効になります。

DATA-RECは,送信するレコードを示します。LEN(TPTYPE-RECの)には,DATA-RECのバイトの最大値を設定します。

Note:DATA-RECが長さを設定する必要がないタイプのレコードである場合は,LENは無視されます(0にしてください)。DATA-RECが長さを設定する必要があるタイプのレコードである場合は,LENに0を設定しないでください。REC-TYPEにsubtypeが設定されていない場合は,SUB-TYPEは無視されます(SPACES(空白)にしてください)。REC-TYPEがSPACES(空白)の場合は,DATA-RECとLENは無視されます。この場合,応答がサービスを呼び出したプログラムから要求されている場合は,データ部がない応答が送信されます。応答が要求されていない場合は,TPRETURNは渡されたデータを無視して,応答を送信しないでリターンします。

サービスが会話型の場合,データ部が送信されない理由には,次の二つの場合があります。

  • 呼び出しが完了したときに,すでにコネクションが切断されている場合(つまり,呼び出し側がコネクションに関するTPEV-DISCONIMMを受信した),この呼び出し側は,単にサービスルーチンを終わらせて,トランザクションがある場合は,ロールバックします。この場合,呼び出し側のデータは送信されません。

  • 上記で説明したように,呼び出し側がコネクションを制御していない場合は,TPEV-SVCFAILまたはTPEV-SVCERRが,オリジネータ(コネクションの確立元)に送信されます。オリジネータがどのイベントを受け取るかどうかに関係なく,データは送信されません。しかし,オリジネータがTPEV-SVCFAILを受信した場合は,オリジネータのリターンコードであるTPSTATUS-RECのAPPL-RETURN-CODEで有効になります。

リターン値

TPRETURNにはEXIT PROGRAM文が含まれているので,値は呼び出し側へ返らないで,また,制御をサービスルーチンに戻しません。サービスルーチンがTPRETURNを使わない場合(それは,直接 EXIT PROGRAM文を使うか,またはサービスルーチンが終わったら),サーバはサービス要求者にサービスエラーをリターンします。すべてのサブオーディネータへのオープンコネクションはすぐに切断されて,未解決の非同期応答は捨てられます。サーバがトランザクションモードで失敗した場合は,トランザクションはrollback_only状態になります。

Note:TPRETURNがサービスルーチンの外で(例えば,サービスでないルーチンから)使った場合,何の効果もありません。

エラー

TPRETURNはサービスルーチンを終了させるので,引数を処理しているときや,処理中のときに起こったエラーは,ルーチンの呼び出し側に通知できません。このようなエラーは,TPCALLかTPGETRPLYを経由してサービスの結果を受信するプログラムでは,TP-STATUSにTPESVCERRが返る要因となります。TPSENDやTPRECVを使っているプログラムでは,イベントTPEV-SVCERRが通知されます。

関連項目

TPCALL,TPCONNECT,TPDISCON,TPSEND,TPSVCSTART

『OpenTP1で使う場合の注意事項』

  1. 『COPY文とREPLACING句は,COBOLコンパイラによって動作が異なります。COBOL85またはCOBOL2002を使う場合には,次に示すようにコーディングしてください。

    COPY TPRETURN 〔{REPLACING〔TPSVCRET-REC BY TPSVCRET-REC〕
                              〔TPTYPE-REC BY TPTYPE-REC〕
                              〔DATA-REC BY DATA-REC〕}〕. 』