Hitachi

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


サービスプログラムの作成(SPP)

〈このページの構成〉

形式

PROGRAM-ID. プログラム名.
LINKAGE SECTION.
01 一意名1.
   02 データ名A  PIC X(n).
01 一意名2.
   02 データ名B  PIC S9(9) COMP.
01 一意名3.
   02 データ名C  PIC X(n).
01 一意名4.
   02 データ名D  PIC S9(9) COMP.
 
PROCEDURE DIVISION USING 一意名1 一意名2 一意名3 一意名4
         :
         :
サービスの処理
         :
         :
EXIT PROGRAM.

機能

サービスを実行して結果を返すSPPのサービスプログラムです。クライアントUAPで呼び出したCBLDCRPC('CALL ')からサービスを要求されます。

サービスプログラムの処理は,上記の形式で任意に作成してください。サービス名は,サービスプログラムのプログラムIDに対応させます。この対応づけは,UAPの実行環境を設定するときに指定します。UAPの実行環境を設定する方法を次に示します。

データ領域の設定

サービスプログラムには,次の値がデータ領域に渡されます。これは,クライアントUAPがCBLDCRPC('CALL ')に設定した値です。

サービスプログラムには,次の値をデータ領域に設定します。

サービスプログラムは,データ名Cに応答を設定して,その長さをデータ名Dに設定してからリターンしてください。

サービスのクライアントUAPへの応答は,サービスプログラムがトランザクションとして実行したかどうか,またはコミットしたかロールバックしたかには無関係に送信されます。必要ならばサービスプログラムでクライアントUAPにエラー発生を知らせる応答を作成してください。

クライアントUAPから値が渡されるデータ領域

●データ名A

クライアントUAPで設定した,入力パラメタが渡されます。

●データ名B

クライアントUAPで設定した,入力パラメタの長さが渡されます。

●データ名D

クライアントUAPで設定した,応答の長さが渡されます。

UAPで値を設定するデータ領域

●データ名C

サービスプログラムからの応答を設定します。サービスプログラムの処理では,データ名Dに処理結果を設定してからリターンしてください。

●データ名D

サービスプログラムからの,実際の応答の長さを設定します。クライアントUAPから渡されたデータ名Dの値以下の数値を設定してください。

サービスプログラムの処理での注意

  1. 非応答型RPCのCBLDCRPC('CALL ')(データ名Cに1を設定)で呼び出したサービスプログラムでは,データ名Cとデータ名Dは参照できません。

  2. サービスプログラムが,COBOLの初期化プログラム(プログラムの見出し部にINITIAL句を指定)である場合,データ項目などの値は,サービス要求1回ごとに初期化されます。プログラムの見出し部にINITIAL句を指定しない場合,データ項目には前回のサービス関数が設定した値が残っているので,必要であれば初期化してから使ってください。

  3. SPPのサービスプログラムから呼び出せないCOBOL-UAP作成用プログラムを次に示します。

    • CBLDCRPC('OPEN ') − アプリケーションプログラムの開始

    • CBLDCADM('COMPLETE') − ユーザサーバの開始処理完了の報告

    • CBLDCRSV('MAINLOOP') − SPPのサービス開始

    • CBLDCRPC('CLOSE ') − アプリケーションプログラムの終了

    サービスプログラムからプログラムの処理を抜ける命令文は使わないでください。このような命令文を使った場合のUAPの動作は保証しません。また,子プロセスを生成するシステムコールを使った場合,生成した子プロセスではOpenTP1のCOBOL-UAP作成用プログラムを呼び出せません。

  4. SPPのサービスプログラムからMCFの機能(CBLDCMCF)を呼び出す場合は,メインプログラムで次に示すCOBOL-UAP作成用プログラムを呼び出しておいてください。

    • CBLDCMCF('OPEN ') − MCF環境のオープン

    • CBLDCMCF('CLOSE ') − MCF環境のクローズ

  5. SPPのサービスプログラムでは,CBLDCMCF('RECEIVE ')は呼び出せません。

  6. データ名Aに渡された入力パラメタに対して,データ名Bに渡された入力パラメタ長の領域を超える操作や参照などはしないでください。操作や参照などをした場合の動作は保証しません。プロセスが異常終了する場合があります。

  7. SPPのサービスプログラムからMCFの関数(CBLDCMCF)を呼び出す場合は,一意名1などのデータ領域は,必ず偶数番地から始まるよう設定してください。一意名1などのデータ領域の先頭アドレスが奇数番地だとバスエラーが発生します。

    例えば,CBLDCMCFで使用する一意名3を配列で定義し,送信データが奇数バイトで,かつ構造体にSYNCの指定がない(境界調整されていない)場合,配列の2件目のデータをCBLDCMCFの引数に設定すると,関数の処理中にバスエラーが発生します。

トランザクションとサービスプログラムの関係

UAPの実行環境を設定するときに,トランザクション属性とする指定をしていて,クライアントUAPがトランザクションとして実行している場合は,サービスプログラムもトランザクションとして実行されます。この場合,サービスプログラムでCBLDCTRN('BEGIN ')を呼び出さないでください。

グローバルトランザクションのそれぞれのサービスは,コミットするか,ロールバックとなるかのどちらかが保証されています。トランザクションブランチとして実行されるサービスプログラムがEXIT PROGRAMで終わることで,そのトランザクションブランチを正常終了させることを要求したことになります。

UAPの実行環境を設定するときに,トランザクション属性とする指定をしていても,クライアントUAPがトランザクションとして実行していないと,サービスプログラムはトランザクションとして実行されません。サービスプログラムの処理をトランザクションとして実行する場合は,任意の時点で CBLDCTRN('BEGIN ')と同期点を取得するプログラムを呼び出してください。

UAPの実行環境を設定するときに,トランザクション属性としない指定をした場合は,サービスプログラムから CBLDCTRN('BEGIN ')を呼び出しても,サービスプログラムはトランザクションとして実行できません。

ステータスコード

ステータスコードはありません。OpenTP1でもステータスコードを参照しません。サービスプログラムから-1をリターンしても,ロールバックを要求したことにはなりません。