Hitachi

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


CBLDCRPC('CALL ')

〈このページの構成〉

名称

遠隔サービスの要求

形式

PROCEDURE DIVISIONの指定

CALL 'CBLDCRPC' USING 一意名1 一意名2 一意名3

DATA DIVISIONの指定

01 一意名1.
   02 データ名A  PIC X(8) VALUE 'CALL    '.
   02 データ名B  PIC X(5).
   02 FILLER    PIC X(3).
   02 データ名C  PIC S9(9) COMP VALUE ZERO.
   02 データ名D  PIC S9(9) COMP.
   02 データ名E  PIC X(32).
   02 データ名F  PIC X(n).
01 一意名2.
   02 データ名G  PIC S9(9) COMP.
   02 データ名H  PIC X(n).
01 一意名3.
   02 データ名I  PIC S9(9) COMP.
   02 データ名J  PIC X(n).

機能

SPPのサービスを要求します。CBLDCRPC('CALL ')を使うときは,要求するサービスがどのノードにあるかを意識する必要はありません。

サービスを要求するときには,「サービスグループ名」と「サービス名」を CBLDCRPC('CALL ')のデータ領域に設定します。この名称に該当するサービスプログラムへサービスが要求されます。

CBLDCRPC('CALL ')を呼び出すUAPは,トランザクションとして実行していてもしていなくてもかまいません。トランザクションとして実行している処理からCBLDCRPC('CALL ')でサービスを要求するときは,要求するサービスの処理はトランザクションブランチとして稼働します。

CBLDCRPC('CALL ')を使う場合,サーバUAPがあるノードのOpenTP1が稼働していることが前提です。

CBLDCRPC('CALL ')を実行して応答を待っている間にシグナルを受信しても,リターンされません。

ステータスコードの一覧のあとに,次の説明を掲載しています。CBLDCRPC('CALL ')の詳しい説明を知りたいときに参照してください。

(1)CBLDCRPC('CALL ')のデータ領域について

(2)CBLDCRPC('CALL ')がエラーになる場合

(3)CBLDCRPC('CALL ')がエラーになるタイミング

(4)CBLDCRPC('CALL ')がエラーになったときに再実行する指定

(5)サービス要求に優先度を付ける場合

(6)ステータスコード「00310」と「00306」の違い

(7)ステータスコード「00378」をリターンさせる指定

(8)ステータスコードと同期点処理の関係

(9)サービスを要求するときの注意

(10)ドメイン修飾をしてサービスを要求する場合

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

●データ名A

遠隔サービスの要求を示す要求コードを「VALUE 'CALL△△△△'」と設定します。

●データ名C

RPCの形態とオプションを,数値で設定します。

0 … 同期応答型RPC

2 … 非同期応答型RPC

1 … 非応答型RPC

4 … 連鎖RPC

トランザクション処理からのサービス要求で,要求先の処理をトランザクションにしない場合は,RPCの形態を示す数値に「32」を加算します。「32」を加算すると,トランザクションの処理からのサービス要求でも,サービスプログラムの処理はトランザクションになりません。

サービスグループ名にドメイン修飾をする場合は,RPCの形態を示す数値に「256」を加算します。ドメイン修飾をしたRPCはトランザクションブランチにできません。そのため,トランザクションの処理から CBLDCRPC('CALL ')を使う場合は,必ず「256」に「32」を加算してください。

(例1)

同期応答型RPCでトランザクションにしないサービス要求をする場合

データ名Cには 0 + 32 = 32 を設定します。

(例2)

トランザクションの処理から,非同期応答型RPCでドメイン修飾をしたサービス要求をする場合

データ名Cには 2 +(256 + 32)= 290 を設定します。

●データ名E

SPPのサービス名を,31バイト以内のアスキー文字列で設定します。文字列の最後には空白を設定してください。この空白は文字列の長さに数えません。

●データ名F

SPPのサービスグループ名を,31バイト以内のアスキー文字列で設定します。文字列の最後には空白を設定してください。この空白は文字列の長さに数えません。

ドメイン修飾をしてサービスを要求するときは,サービスグループ名のあとに @(アットマーク)とDNSのドメイン名を付けて,文字列の最後には空白を設定してください。

●データ名G

サービスの入力パラメタ長(データ名Hの長さ)を設定します。1から DCRPC_MAX_MESSAGE_SIZEまでの範囲の長さが設定できます。DCRPC_MAX_MESSAGE_SIZEは,dcrpc.hで定義してあります。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

●データ名H

サービスの入力パラメタを設定します。

●データ名I

サービスの応答の長さ(データ名Jの長さ)を設定します。1から DCRPC_MAX_MESSAGE_SIZEまでの範囲の長さが設定できます。DCRPC_MAX_MESSAGE_SIZEは,dcrpc.hで定義してあります。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

サーバUAPから値が返されるデータ領域

●データ名B

ステータスコードが,5けたの数字で返されます。

●データ名D

非同期応答型RPCの場合に,記述子が返されます。

●データ名I

サービスプログラムが設定した,応答の長さ(データ名Jの長さ)が返されます。

●データ名J

サービスプログラムが設定した,応答が返されます。

ステータスコード

ここで示すステータスコードは,OpenTP1が返す値です。サービスプログラムから返される値ではありません。

ステータスコード

意味

00000

正常に終了しました。非同期応答型RPCの場合は,データ名Dに記述子が設定されました。

00301

データ名に設定した値が間違っています。

要求コード(データ名A)が間違っている場合も含みます。

00302

CBLDCRPC('OPEN ')を呼び出していません。

非オートコネクトモード(ユーザサービス定義のrpc_rap_auto_connectオペランドにNを指定)で,リモートAPI機能を使用時にCBLDCRAP('CONNECT ')またはCBLDCRAP('CONNECTX')を呼び出していません。

00304

メモリが不足しました。または,サービス要求先SPPのメッセージ格納バッファプール(message_store_buflenオペランド)が不足したため,サービス要求を受け付けられませんでした。

サービス要求先SPPのユーザサービス定義,またはユーザサービスデフォルト定義のmessage_store_buflenオペランドの指定値を見直してください。

00306

通信障害が起こりました。

ネットワークに障害が発生していないか確認してください。

リモートAPI機能を使用している場合は,CBLDCRPC('CALL ')の応答待ち時間を満了した可能性があります。CBLDCRPC('CALL ')の応答待ち時間の設定(watch_timeオペランド,CBLDCRPC('SETWATCH'))を見直してください。

リモートAPI機能使用時にCBLDCRPC('CALL ')の応答待ち時間を満了した場合のステータスコードを00307に変更するには,ユーザサービス定義にrap_extend_functionオペランドを指定してください。

rap_extend_functionオペランドについてはマニュアル「OpenTP1 システム定義」を参照してください。

00307

CBLDCRPC('CALL ')の応答待ち時間を満了しました。

CBLDCRPC('CALL ')の応答待ち時間の設定(watch_timeオペランド,CBLDCRPC('SETWATCH'))を見直してください。

サービス要求先SPPが,サービスプログラムの実行中に異常終了しました。

サービス要求先SPPが異常終了した要因を調査してください。

00308

データ名Gに設定した入力パラメタ長が,最大値を超えています。

データ名Gの設定値を見直してください。

00309

サービス要求先SPPのサービスプログラムで設定した応答の長さ(サービスプログラムのデータ名D)が,CBLDCRPC('CALL ')の応答の長さ(サービスプログラムのデータ名I)を超えました。

サービス要求先SPPのサービスプログラムでの応答の長さ(サービスプログラムのデータ名D)の設定を見直してください。

00310

データ名Fに設定したサービスグループ名が不正であるか,データ名Fに設定したサービスグループのサービス要求先SPPが起動されていません。

データ名Fの設定を見直すか,データ名Fに設定したサービスグループのサービス要求先SPPを起動してください。

00311

データ名Eに設定したサービス名が不正であるか,サービス要求先SPPでデータ名Eに設定したサービス名がユーザサービス定義ファイルのserviceオペランドに設定されていません。

データ名Eの設定を見直すか,データ名Eに設定したサービス名をサービス要求先SPPのserviceオペランドに設定してください。

00312

データ名Fで設定したサービスグループのサービス要求先SPPは,サーバ閉塞またはサービス閉塞しています。閉塞要因を調査し,閉塞を解除してください。

00313

サービス要求先SPPは,終了処理中です。

00314

データ名Fに設定したサービスグループ名のサービス要求先SPPは起動していません。または,サービス要求送信処理で通信障害が起きたおそれがあります。

データ名Fに設定したサービスグループ名のサービス要求先SPPを起動してください。すでに起動している場合は,ネットワーク障害が発生していないかを確認してください。

サービス要求の応答待ち時間(watch_timeオペランド,CBLDCRPC('SETWATCH'))に0を指定している場合に,サービスプログラムを実行中のサービス要求先SPPが異常終了しました。サービス要求先SPPが異常終了した要因を調査してください。

00315

サービス要求先SPPのOpenTP1が起動していません。OpenTP1が停止処理中であるか,サービス要求送信処理で通信障害が起きたおそれがあります。

サービス要求先SPPのOpenTP1を起動するか,ネットワーク障害が発生していないかどうかを確認してください。

00316

サービス要求先SPPで,システムエラー(内部矛盾)が起こりました。

00317

サービス要求先SPPで,メモリが不足しました。

00318

サービス要求元UAPで,システムエラー(内部矛盾)が起こりました。

00319

サービス要求先SPPのサービスプログラムで設定する応答の長さ(サービスプログラムのデータ名D)が,1からDCRPC_MAX_MESSAGE_SIZEで定義されている値の範囲にありません。

サービス要求先SPPのサービスプログラム内の応答の長さ(サービスプログラムのデータ名D)の設定を見直してください。

00320

サービス要求先SPPのOpenTP1は,開始処理中です。

00323

サービス要求元UAP,またはサービス要求先SPPで,メモリが不足しました。このステータスコードが返った場合,トランザクションブランチはロールバックします。

サービス要求元UAP,またはサービス要求先SPPで,不要なメモリを確保していないか見直してください。

00324

サービス要求元UAPで,システムエラー(内部矛盾)が起こりました。このステータスコードが返った場合,トランザクションブランチはロールバックします。

00325

サービス要求先SPPで,システムエラー(内部矛盾)が起こりました。このステータスコードが返った場合,トランザクションブランチはロールバックします。

00326

サービス要求先SPPのサービスプログラムで設定した応答の長さ(サービスプログラムのデータ名D)が,CBLDCRPC('CALL ')の応答の長さ(データ名I)を超えました。このステータスコードが返った場合,トランザクションブランチはロールバックします。

サービス要求先SPPのサービスプログラムで,応答の長さ(サービスプログラムのデータ名D)の設定を見直してください。

00327

ノード間負荷バランス機能,およびノード間負荷バランス拡張機能を使用している場合に,同一サービスグループ名のサービス要求先SPPのトランザクション属性(atomic_updateオペランド)が不一致になっています。または,負荷を分散する先のノードにあるOpenTP1のバージョンが,要求元UAPのOpenTP1のバージョンよりも古いため,ノード間負荷バランス機能,およびノード間負荷バランス拡張機能を実行できません。

このステータスコードが返るのは,ノード間負荷バランス機能およびノード間負荷バランス拡張機能を使用しているSPPにサービスを要求した場合だけです。

ノード間負荷バランス機能,およびノード間負荷バランス拡張機能を使用するSPPのトランザクション属性(atomic_updateオペランド),またはOpenTP1のバージョンを見直してください。

dcsvgdef定義コマンドを使用して,非トランザクション属性(ユーザサービス定義のatomic_updateオペランドに'N'を指定,またはシステム共通定義のjnl_fileless_optionオペランドに'Y'を指定)のユーザサーバに対し,CBLDCRPC('CALL ')のデータ名Cに「32」を加算しないでサービスを要求しました。

00328

データ名Fのドメイン修飾をしたサービスグループ名のドメイン名が間違っています。

ドメイン名を見直してください。

00329

データ名Fにドメイン修飾をしてサービスを要求しましたが,ドメイン代表スケジュールサービスのポート番号が見つかりません。

システム共通定義のdomain_masters_porオペランドの設定,および/etc/servicesのドメイン代表スケジューラサービスのポート番号の設定を見直してください。

00356

サービス要求先SPP(ソケット受信型サーバ)が,サービス要求電文を受け取れません。

サービス要求先SPPのユーザサービス定義,またはユーザサービスデフォルト定義のmax_socket_msgオペランド,max_socket_msglenオペランドの設定を見直してください。

00366

オンラインテスタを使用している環境で,テストモードのUAPからテストモードでないSPPへサービスを要求しています。または,テストモードでないUAPからテストモードのSPPへサービスを要求しています。

UAPのテストモードの設定を見直してください。

00367

トランザクション属性の連鎖RPCを実行したあと,データ名Cをトランザクションにしない設定にした状態でCBLDCRPC('CALL ')によってサービスを要求しています。

00370

サービス要求先SPPは,セキュリティ機能で保護されています。

CBLDCRPC('CALL ')を実行したサービス要求元UAPには,サービス要求先SPPへのアクセス権限がありません。サービス要求先SPPのアクセス権限を見直してください。

00372

サービス要求先SPPのOpenTP1で,同時に起動できるトランザクションブランチの数を超えました。そのため,トランザクションブランチを開始できません。

トランザクションサービス定義のtrn_tran_process_countオペランドの設定を見直してください。

サービス要求元UAPが,一つのトランザクションブランチから開始できる子トランザクションブランチの最大数を超えました。そのため,トランザクションブランチを開始できません。

トランザクションサービス定義のtrn_max_subordinate_countオペランドの設定を見直してください。

トランザクション内でドメイン修飾をしたサービス要求で,データ名Cに「32」を加算していません。

サービス要求先SPPで,リソースマネジャ(RM)にエラーが発生しました。そのため,トランザクションブランチを開始できません。

リソースマネジャ(RM)のエラー要因を解決したあと,再度実行してください。

TP1/LiNKの「システム環境設定」ウィンドウの「トランザクション機能」が[あり]に設定されていません。

TP1/LiNKの「システム環境設定」の「トランザクション機能」の設定を見直してください。

00378

サービス要求先SPPが,サービスプログラムの実行中に異常終了しました。

サービス要求先SPPのサービスプログラム処理を見直してください。このステータスコードが返るのは,ユーザサービス定義のrpc_extend_functionオペランドに"00000001"を指定したサービス要求元UAPの場合だけです。rpc_extend_functionオペランドに"00000000"を指定,またはオペランドを省略した場合は,このステータスコードではなく,「00307」または「00314」が返ります。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

(1)CBLDCRPC('CALL ')のデータ領域について

CBLDCRPC('CALL ')のデータ領域について説明します。

サーバUAPに渡す値

サービスを要求するときには,サービスプログラムから返ってくる応答の領域(データ名J)を確保しておきます。クライアントUAPでは CBLDCRPC('CALL ')に次の値を設定します。

  • 入力パラメタ(データ名H)

  • 入力パラメタ長(データ名G)

  • 応答の長さ(データ名I)

入力パラメタ,入力パラメタ長,応答の長さは,クライアントUAPの CBLDCRPC('CALL ')で設定した値が,そのままサービスプログラムに渡されます。文字コードや数字の表記形式を変えたい場合は,クライアントUAP,または要求されたサービスプログラムの処理で変換してください。応答を返さないサービスプログラムのサービスを要求するときは,応答の長さを設定しても無視されます。

入力パラメタ長と応答の長さの最大値は,それぞれヘッダファイルdcrpc.hのDCRPC_MAX_MESSAGE_SIZEで宣言しています。最大値を確認する場合は,dcrpc.hの内容を参照してください。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

サーバUAPから戻ってくる値

サービスプログラムの処理が終了して応答が戻ってくると,次の値を参照できます。

  • サービスプログラムの応答(データ名J)

  • サービスプログラムの応答の長さ(データ名I)

データ名Iはサービスプログラムから実際に返ってきた応答の長さです。データ名Jとデータ名Iを参照できる場合を次に示します。

  • 同期応答型RPC,連鎖RPCの場合

    CBLDCRPC('CALL ')がリターンしたあと。

  • 非同期応答型RPCの場合

    CBLDCRPC('POLLANYR')が,該当する応答を受け取ってリターンしたあと。データ名Iは参照できません。

  • 非応答型RPCの場合

    データ名Jとデータ名Iは参照できません。

CBLDCRPC('CALL '),またはCBLDCRPC('POLLANYR')がエラーリターンした場合には,データ名Jとデータ名Iは参照できません。

返ってきた応答が,クライアントUAPで確保した応答の領域(データ名I)よりも大きい場合は,ステータスコード「00309」でエラーリターンします。

データ名Cに設定する値

データ名Cに設定した値とCBLDCRPC('CALL ')の実行結果について説明します。

  • 同期応答型RPC(データ名Cに0を設定)

    CBLDCRPC('CALL ')は,応答が返るか,通信先でエラーが起こるまでリターンしません。

  • 非同期応答型RPC(データ名Cに2を設定)

    CBLDCRPC('CALL ')は,すぐにリターンします。ただし,応答と応答の長さを参照できるのは,CBLDCRPC('POLLANYR')で非同期に応答を受信したあとです。応答(データ名J)の領域は,次に示す方法で非同期応答型RPCを終了するまで,解放しないでください。

    • CBLDCRPC('POLLANYR')で応答を受け取る

    • CBLDCRPC('DISCARDF')で応答の受信を拒否

    • トランザクションの処理からサービスを要求した場合は,コミット,またはロールバックした

トランザクションの処理で非同期応答型RPCを使う場合,同期点処理(コミット,またはロールバック)前に CBLDCRPC('POLLANYR')で応答を受け取ってください。同期点処理後には,CBLDCRPC('POLLANYR')で応答は受け取れません。

CBLDCRPC('POLLANYR')が受信する応答を特定する場合は,CBLDCRPC('CALL ')がリターンしたときに返された正の整数(記述子)を,CBLDCRPC('POLLANYR')の引数に設定します。受信する応答を特定する場合は,CBLDCRPC('CALL ')のデータ名Dの値を保持しておいてください。

なお,非トランザクションの処理で,同期点処理後に応答を受け取りたい場合は,システムサービス定義のrpc_extend_functionオペランドで該当するオプションを指定する必要があります。rpc_extend_functionについては,マニュアル「OpenTP1 システム定義」を参照してください。

  • 非応答型RPC(データ名Cに1を設定)

    CBLDCRPC('CALL ')は,サービスプログラムの処理が終わるのを待たないで,すぐにリターンします。サービスプログラムは応答を返さないサービスと見なされます。そのため,サービスプログラムが実行されたかどうかは,サービスを要求したUAPからはわかりません。非応答型RPCを設定した場合は,応答(データ名J)と応答の長さ(データ名I)の値は参照できません。

  • 連鎖RPC(データ名Cに4を設定)

    CBLDCRPC('CALL ')は,応答が返るか,通信先でエラーが起こるまでリターンしません。連鎖RPCで同じサービスグループに属するサービスを複数回要求する場合は,最初の要求時と同じプロセスで実行できます。

    連鎖RPCを使う場合には,次に示す制限があります。

    1. 2回目以降のCBLDCRPC('CALL ')では,ユーザサーバ,およびサービスの閉塞を検出できません。

    2. 2回目以降のCBLDCRPC('CALL ')でサービスプログラムの処理で異常が起こった場合には,ユーザサーバ全体が閉塞します。サービス単位では閉塞しません。

(2)CBLDCRPC('CALL ')がエラーになる場合

CBLDCRPC('CALL ')のエラーリターンする理由について説明します。

サーバUAPがあるノードのOpenTP1が稼働していない場合

サービスを要求されるOpenTP1が稼働していない場合は,CBLDCRPC('CALL ')は次に示すどれかのステータスコードでエラーリターンします。

「00306」

「00314」

「00315」

「00320」

サーバUAPが稼働していない場合

サーバUAPがマルチサーバの場合,異常終了中,または部分回復処理中であっても,サービス要求はOpenTP1で新しく起動されたプロセスで実行されます。ただし,次に示す場合は,CBLDCRPC('CALL ')はエラーリターンします。

  1. 閉塞しているSPPへはサービスを要求できません。サービスグループが閉塞されている場合は,「00312」でエラーリターンします。

  2. ユーザサーバの停止コマンド(dcsvstopコマンド)またはOpenTP1の停止コマンド(dcstopコマンド)で,SPPが終了処理中または終了している場合は,次に示すどれかのステータスコードでエラーリターンします。

    「00310」

    「00312」

    「00313」

    これらのうち,どのステータスコードが返るかは,CBLDCRPC('CALL ')を呼び出したタイミングで決まります。

  3. OpenTP1が開始処理中の場合は,「00320」でエラーリターンします。この場合は,サーバUAP,またはOpenTP1が起動完了したあとに正常にサービスを要求できることがあります。OpenTP1は,メッセージID KFCA01809-Iのメッセージログが出力されると起動を完了するので,このメッセージが表示されてから再びサービスを要求してください。

ノード間負荷バランス機能およびノード間負荷バランス拡張機能の環境でサービスを要求した場合

ノード間負荷バランス機能およびノード間負荷バランス拡張機能の環境では,該当するサービスのスケジュールが閉塞していると,OpenTP1が自動的にほかのノードにサービス要求を転送します。ただし,次に示す条件の場合 CBLDCRPC('CALL ')は「00327」でエラーリターンします。

  1. トランザクション処理の場合,転送しようとした先のノードにあるサービスのトランザクション属性が,閉塞していたサービスと一致していないとき。

  2. 転送しようとした先のノードにあるOpenTP1のバージョンが,サービスを要求したOpenTP1のノードのバージョンよりも低いとき。

これらのエラーリターンが起こった場合は,次に示す処置をしてください。

  1. ノード間負荷バランス機能およびノード間負荷バランス拡張機能を構成する複数のSPPのトランザクション属性を一致させてください。

  2. ノード間負荷バランス機能およびノード間負荷バランス拡張機能を構成する複数のOpenTP1のバージョンを一致させてください。

ソケット受信型サーバへサービスを要求する場合

ソケット受信型サーバでは,ユーザサービス定義のmax_socket_msgオペランドとmax_socket_msglenオペランドの指定で,データの輻輳制御をしています。そのため,定義した値を超えた場合,サービス要求を受信できない場合があります。このとき CBLDCRPC('CALL ')は,「00356」でエラーリターンします。このステータスコードが返った場合,クライアントUAPはしばらく時間をおいてから再実行すれば,サービスを要求できることがあります。

連鎖RPCを使った場合

トランザクションとして処理している連鎖RPCを使っているUAPから,同じサーバUAPへトランザクションでないCBLDCRPC('CALL ')を呼び出すと,「00367」でエラーリターンします。

オンラインテスタを使っている場合

オンラインテスタを使っている場合に,テストモードのUAPとテストモードでないUAPとの間でCBLDCRPC('CALL ')を呼び出すと,「00366」でエラーリターンします。

セキュリティ機能を使っている場合

目的のサービスがセキュリティ機能で保護されていて,CBLDCRPC('CALL ')を呼び出したクライアントUAPにSPPへのアクセス権がない場合は,「00370」でエラーリターンします。

(3)CBLDCRPC('CALL ')がエラーになるタイミング

サービスを要求されたSPPが異常終了した場合,クライアントUAPでエラーが返るタイミングについて説明します。

クライアントUAPの時間監視でエラーになる場合

次に示す場合には,クライアントUAPのユーザサービス定義のwatch_timeオペランドに指定した時間が経過したあとで,「00307」でエラーリターンします。

  • SPPがあるノードのOpenTP1全体が異常終了した場合

  • サービス要求のデータがサーバUAPに届く前,またはサーバUAPの処理が完了してからクライアントUAPに結果が届く前に障害が起こった場合

(4) CBLDCRPC('CALL ')がエラーになったときに再実行する指定

開始処理中,または系切り替え中などでサービス要求先のOpenTP1が起動していない場合でも,CBLDCRPC('CALL ')をエラーとしないで,OpenTP1で要求先検索,およびサービス要求送信を再実行させることができます。

要求先検索,およびサービス要求送信を再実行させる場合は,システム共通定義にrpc_retryオペランドにYを指定してください。要求先検索とサービス要求送信の再実行回数,および再実行間隔は,システム共通定義のrpc_retry_countオペランドとrpc_retry_intervalオペランドで指定します。システム共通定義で指定した再実行回数を超えた場合は,CBLDCRPC('CALL ')は次に示すどれかのステータスコードでエラーリターンします。

「00301」

「00306」

「00310」

「00314」

「00315」

「00320」

(5)サービス要求に優先度を付ける場合

サービス要求のスケジュールプライオリティは,CBLDCRPC('CALL ')を呼び出す直前に,CBLDCRPC('SETSVPRI')を呼び出して設定します。プライオリティを設定しない場合は,スケジュールサービスの省略時の解釈で,サービス要求の優先度が決まります。

(6)ステータスコード「00310」と「00306」の違い

上記のステータスコードは,該当するサービスグループ名のユーザサーバが見つからなかった場合にリターンされます。

(7)ステータスコード「00378」をリターンさせる指定

サービスを要求されたSPPが,処理を完了する前に異常終了したことを「00307」または「00314」以外のステータスコードで判別したい場合には,ユーザサービス定義の rpc_extend_functionオペランドに"00000001"を指定します。この指定をすると,上記のエラー時に「00378」がリターンされるようになります。rpc_extend_functionオペランドに"00000000"を指定,またはオペランドを省略した場合は,「00378」はリターンされないで,「00307」または「00314」がリターンされます。

(8)ステータスコードと同期点処理の関係

CBLDCRPC('CALL ')のステータスコードと同期点処理(コミット,ロールバック)の関係について説明します。ここで説明する内容は,サービス要求がトランザクション処理になる場合に該当します。トランザクションでないサービス要求(データ名CのRPCの形態を示す数値に「32」を加算した場合も含む)には該当しません。

CBLDCRPC('CALL ')がエラーリターンしてもコミットとなる場合

サービスを要求されたサービスプログラムの異常終了や,ノードの障害,ネットワーク障害の場合でも,「00307」がリターンすることがあります。クライアントUAPがトランザクション処理でない場合は,「00307」が返っても,要求したサービスがあるサービスプログラムは正常に終了していて,データベースへの更新などが実行されているときもあります。

ロールバック処理が必要なステータスコード

トランザクション処理から呼び出したCBLDCRPC('CALL ')がエラーリターンした場合,ステータスコードによっては,必ずトランザクションがロールバック(サーバUAPがrollback_only状態)になります。この場合,コミット,またはロールバックのCOBOL-UAP作成用プログラムのどちらを使っても,必ずロールバックになります。必ずロールバックになるCBLDCRPC('CALL ')のステータスコードを次に示します。

「00311」

「00317」

「00319」

「00326」

(9)サービスを要求するときの注意

  1. CBLDCRPC('CALL ')に設定するサービスグループ名およびサービス名は,サーバUAPの環境設定で指定しておいてください。間違ったサービスグループ名またはサービス名をCBLDCRPC('CALL ')に設定してサービスを要求すると,「00310」または「00311」でエラーリターンします。

    応答を返さないサービスプログラムの場合,「00310」はリターンしません。

  2. サーバUAPは,クライアントUAPとは別のプロセスで実行します。そのため,通常の手続き呼び出しとは,次の点が異なります。

    • OSがクライアントUAPのプロセスに与えている属性は,サーバUAPへは引き継がれません(例えば,環境変数,スケジュールの優先順位(nice値)など)。

    • クライアントUAPのノードで設定したOpenTP1の環境設定は,サーバUAPのOpenTP1へは引き継がれません(例えば,トランザクション属性の指定有無,トランザクションブランチの限界経過時間,スケジュールの優先順位など)。

  3. 入力パラメタ,およびサービスプログラムの応答に,同じバッファ領域を設定しないでください。

  4. データ名Cに「1」(非応答型RPC)を設定した場合には,次に示すステータスコードは返りません。

    • 起こらないエラー

      「00309」

      「00319」

    • 起こっても検出できないエラー

      「00311」

      「00313」

      「00316」

      「00370」

    また,エラー発生時にOpenTP1にメッセージを出力することもありません。エラーを検出しなければならない場合,データ名Cに「0」を設定する(同期応答型RPC)ことを検討してください。

  5. トランザクションの処理からCBLDCRPC('CALL ')でサービスグループを呼び出すと,トランザクションが決着するまで一つのSPPを占有します。同じトランザクションの処理から,CBLDCRPC('CALL ')で同じサービスを複数回使う場合は,次に示すようにしてください。

    • 使う回数に応じて,ユーザサービス定義のbalance_countオペランドおよびparallel_countオペランドの指定値を見積もり直す。

    • プロセスが増えないように,連鎖RPCでサービスを要求する。

    balance_countオペランドおよびparallel_countオペランドの指定値に誤りがあると,トランザクションが異常終了したり,デッドロックが起こったりする場合があります。

  6. 非同期応答型RPCを使う場合には,CBLDCRPC('POLLANYR')ですべての非同期の応答を受信するか,CBLDCRPC('DISCARDF')で非同期の応答を拒否するまで,サーバUAP(SPP)を占有する場合があります。これは,トランザクションの処理の場合にもトランザクションの処理でない場合にも起こります。非同期応答型RPCを使う場合には,使う回数に応じて,常駐プロセス数の指定を増やしておいてください。

    非同期応答型RPCは,SPPを占有すること以外にも多くの資源を必要とします。UAPの処理効率が下がったり,必要ないSPPが開始されたりすることを防ぐため,非同期応答型RPCのCBLDCRPC('CALL ')を使ったあとには,確実に応答を受信するか,受信を拒否するかしてください。

  7. 非同期応答型RPCでサービス要求を連続して複数回使ったあとで応答を受信する場合には,非同期応答型RPCのサービスを要求するときに,それぞれのサービス要求に対して,次のように異なる応答格納領域を設定してください。同じ領域を設定すると,あとから受信した応答が上書きされて,応答を正しく受信できなくなります。

    01 一意名3-1.
       02 データ名I1 PIC S9(9) COMP.
       02 データ名J1 PIC X(n).
    01 一意名3-2.
       02 データ名I2 PIC S9(9) COMP.
       02 データ名J2 PIC X(n).
    01 一意名3-3.
       02 データ名I3 PIC S9(9) COMP.
       02 データ名J3 PIC X(n).
  8. 非同期応答型RPCでサービス要求したサーバUAP(SPP)は,非同期応答型RPCを実行したプロセスがCBLDCRPC('POLLANYR')を発行したかどうかにかかわらず,サービス関数実行後にすぐに応答を送信します。CBLDCRPC('POLLANYR')を発行しないで,複数回の非同期応答型RPCを大量に実行すると,SPPから送信される応答がTCP/IPのバッファにたまり,SPPの応答送信処理が失敗する場合があります。SPPで応答送信処理が失敗すると,非同期応答型RPC発行元では,CBLDCRPC('POLLANYR')を発行しても,SPPから応答を受信することはできません。

  9. トランザクション属性の非同期応答型RPC,または非応答型RPCを大量に実行すると,SPPから送信されるトランザクションについてのメッセージを受信できなくなり,トランザクションがロールバックすることがあります。

(10)ドメイン修飾をしてサービスを要求する場合

ドメイン修飾したサービスグループ名を設定すると,DNSのドメイン内にあるOpenTP1のサービスを要求できます。ドメイン修飾をしたサービスグループ名は,サービスグループ名のあとに @DNSのドメイン名を続けて設定します。

ドメイン修飾をしてサービスを要求するときの注意

  1. ドメイン修飾をしてサービスを要求する場合は,CBLDCRPC('CALL ')のデータ名CのRPCの形態を示す数値に(256+32)を加算します。(256+32)を加算しないでドメイン修飾をしたサービスグループ名を設定すると,CBLDCRPC('CALL ')は「00310」でエラーリターンします。

  2. ドメイン修飾したRPCは,CBLDCRPC('CALL ')を呼び出したプロセスがトランザクションの処理でも,トランザクションを拡張できません。そのため,トランザクションの処理からドメイン修飾をしたサービス要求をする場合は,データ名CのRPCの形態を示す数値に(256+32)を加算して,トランザクションを拡張しないようにしてください。なお,ドメイン名に自ドメインを設定した場合でも,トランザクションを拡張できません。

  3. ドメイン修飾をしたRPCでは,キュー受信型サーバにだけサービスを要求できます。ソケット受信型サーバへは,ドメイン修飾をしたサービス要求はできません。

  4. ドメイン修飾をしたサービス要求では,namdomainsetupコマンドで登録したホストで起動されるドメイン代表スケジュールサービスへサービス要求を送信します。ドメイン代表スケジュールサービスのポート番号は,/etc/services から取得します。サービス要求の送信で障害が起こった場合は,namdomainsetupコマンドで複数のホスト名を登録していれば,順次送信を試みます。ドメイン修飾をしたRPCが正常に終了しても,ドメイン代表スケジュールサービスへの送信で障害が起こっている場合もあります。

ドメイン修飾をしたサービス要求をする前の準備

ドメイン修飾をしたRPCでは,次に示す環境設定をしてください。

  1. DNSのドメインデータファイルへ,ドメイン代表スケジュールサービスを起動するホスト名を登録します。登録するときは,namdomainsetupコマンドを使います。

  2. ドメイン修飾をしたサービス要求をするOpenTP1を起動するホストの /etc/services へ,ドメイン代表スケジュールサービスのポート番号を設定します。ポート番号は,次の形式で記述してください。

        OpenTP1scd  ポート番号/tcp
  3. ドメイン代表スケジュールサービスを起動するOpenTP1のスケジュールサービス定義のscd_portオペランドに,ドメイン代表スケジュールサービスのウェルノウンポートを指定します。

指定例

サービス「ADD」を実行するクライアントUAP

01 一意名1.
   02 データ名A     PIC X(8) VALUE 'CALL    '.
   02 STATUS-CODE  PIC X(5) VALUE SPACES.
   02 FILLER       PIC X(3).
   02 FLAGS        PIC S9(9) COMP VALUE ZERO.
   02 DESCRIPTOR   PIC S9(9) COMP VALUE ZERO.
   02 SERVICE-NAME PIC X(32) VALUE SPACES.
   02 GROUP-NAME   PIC X(32) VALUE SPACES.
01 一意名2.
   02 NAME-LENG    PIC S9(9) COMP.
   02 NAME         PIC X(32) VALUE SPACES.
01 一意名3.
   02 RESULT-LENG  PIC S9(9) COMP.
   02 RESULT       PIC X(20).
*
 MOVE 'ADDRESS-BOOK ' TO GROUP-NAME.
 MOVE 'ADD' TO SERVICE-NAME.
 MOVE 'SATO' TO NAME.
 MOVE 4 TO NAME-LENG.
 MOVE 20 TO RESULT-LENG.
 CALL 'CBLDCRPC' USING 一意名1 一意名2 一意名3.
 IF STATUS-CODE NOT = '00000' THEN
    DISPLAY 'FAILED'
 END-IF.
 STOP RUN.

サービス「ADD」を実行するサーバUAP

 PROGRAM-ID. ADD.
 DATA DIVISION.
 LINKAGE SECTION.
 01 一意名1.
    02 ADD-NAME     PIC X(20).
 01 一意名2.
    02 NAME-LENG    PIC S9(9) COMP.
 01 一意名3.
    02 RESULT       PIC X(20).
 01 一意名4.
    02 RESULT-LENG  PIC S9(9) COMP.
      :
      :
 PROCEDURE DIVISION USING 一意名1 一意名2 一意名3 一意名4.
      :
* 受け取った一意名1の内容を処理する
     :
 MOVE 'ADD-COMPLETE' TO RESULT.
 MOVE 12 TO RESULT-LENG.
 EXIT PROGRAM.

注意事項

システム共通定義のall_node句で指定したドメイン以外のOpenTP1システムにトランザクショナルRPCを行う場合,自ドメインおよび他ドメイン内のすべてのOpenTP1システムのノード識別子(システム共通定義のnode_idオペランド)は一意にする必要があります。また,すべてのOpenTP1システムは,バージョン03-02以降にする必要があります。これらの条件を満たしていないと,トランザクションが正しく回復できなくなる場合があります。