6.3.3 CBLDCRPS('CALL ') − 遠隔サービスの要求
(1) 形式
(a) マルチスレッド環境の場合
■ PROCEDURE DIVISIONの指定
CALL 'CBLDCRPS' 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(32). 02 データ名G PIC 9(9) COMP-X. 01 一意名2. 02 データ名H PIC S9(9) COMP. 02 データ名I PIC X(n). 01 一意名3. 02 データ名J PIC S9(9) COMP. 02 データ名K PIC X(n).
(b) シングルスレッド環境の場合
■ 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(32). 01 一意名2. 02 データ名H PIC S9(9) COMP. 02 データ名I PIC X(n). 01 一意名3. 02 データ名J PIC S9(9) COMP. 02 データ名K PIC X(n).
(2) 機能
SPPのサービスを要求します。「サービスグループ名+サービス名」に該当するサービスプログラムを呼び,その応答を受け取ります。
サービス要求されたサーバUAPが存在するノードのOpenTP1は,稼働していなけばなりません。OpenTP1が稼働していない場合(開始処理中を含む)は,CBLDCRPS('CALL ')は,02406,02415,02420でエラーリターンします。
CBLDCRPS('CALL ')を実行したときに,目的のサービスグループが閉塞されている場合は,02412でエラーリターンします。
CBLDCRPS('CALL ')を実行したときに,目的のサービスグループがdcsvstopコマンドなどで終了処理中,または終了している場合,02413,02412,02410のうちのどれかでエラーリターンします。どのステータスコードが戻るかは,CBLDCRPS('CALL ')を実行したタイミングで決まります。
ソケット受信型サーバでは,ユーザサービス定義のmax_socket_msgとmax_socket_msglenの指定でデータの輻輳制御をしています。そのため,サービス要求を受信できない場合があります。このとき,CBLDCRPS('CALL ')は,02456でエラーリターンします。この値が戻った場合,CUPは適当な時間をおいてから再実行すれば,サービス要求できる場合があります。
通常の通信形態の場合,クライアント環境定義DCCLTSERVICEGROUPLISTにXDM/DCCM3論理端末のホスト名およびポート番号を指定し,CBLDCRPS('CALL ')を実行します。
(a) サーバUAPに渡す値
CUPでは,サービスプログラムの応答の領域(データ名K)を確保しておきます。さらに,CUPではCBLDCRPS('CALL ')に次の値を指定します。
-
入力パラメタ(データ名I)
-
入力パラメタ長(データ名H)
-
応答の長さ(データ名J)
入力パラメタ,入力パラメタ長,応答の長さは,CUPのCBLDCRPS('CALL ')で指定した値がそのままサービスプログラムに渡されます。応答を返さないサービスプログラムのサービスを呼ぶときは,応答の長さを指定しても無視されます。入力パラメタ長と応答の長さの最大値は,C言語のヘッダファイルdcvrpc.hで規定しているDCRPC_MAX_MESSAGE_SIZE※です。
- 注※
-
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
(b) サーバUAPから戻ってくる値
サービスプログラムの処理の終了後に,次の値が参照できます。
-
サービスプログラムの応答(データ名K)
-
サービスプログラムの応答の長さ(データ名J)
データ名Jは,サービスプログラムから実際に返ってきた応答の長さです。同期応答型RPC(データ名Cに0を設定)の場合,CBLDCRPS('CALL ')がリターンしたあと,データ名Kとデータ名Jを参照できます。非応答型RPC(データ名Cに1を設定)の場合,データ名Kとデータ名Jは参照できません。また,CBLDCRPS('CALL ')がエラーリターンした場合もデータ名Kとデータ名Jは参照できません。
返ってきた応答がCUPで確保した応答の領域(データ名K)よりも大きい場合は,ステータスコード02409でエラーリターンします。
(3) UAPで値を設定するデータ領域
-
データ名A
遠隔サービスの要求を示す要求コードを「VALUE 'CALL△△△△'」と設定します。
-
データ名C
RPCの形態を設定します。
0:同期応答型RPC
1:非応答型RPC
4:連鎖RPC
データ名Cに0,または4を指定すると,応答が返されてくるか,または応答待ち時間(クライアント環境定義DCWATCHTIMの値)切れ(タイムアウト)エラーになるまで,CBLDCRPS('CALL ')は戻りません。ただし,サービス要求先のSPPがアボートした場合は,即時にエラーリターンします。
この場合,DCWATCHTIMで指定された応答待ち時間によって,次の二つのステータスコードが返されます。
-
DCWATCHTIMに1〜65535を指定した場合:02407
-
DCWATCHTIMに0(無限に待つ)を指定した場合:02414
このため,サービス要求されるサービスプログラムごと,または1回のサービス要求ごとの応答待ち時間は指定できません。
データ名Cに1を指定すると,要求したサービスは応答を返さないサービスとみなされます。この場合,CBLDCRPS('CALL ')はサービスの実行終了を待たないで,すぐに戻ります。この指定をした場合は,応答(データ名K)と応答の長さ(データ長J)は参照できません。さらに,サービスプログラムが発行されたかどうかは,CUPではわかりません。
トランザクションの処理からのRPCを,トランザクションとしないサービス要求にできます。RPCの形態を示すパラメタに32を指定すると,該当するCBLDCRPS('CALL ')のサービス要求は,トランザクションの処理でないサービス要求になります。
32:同期応答型RPC
33:非応答型RPC
36:連鎖RPC
また,トランザクション外,または常設コネクション確立中でないときに4を指定するとステータスコード02401でエラーリターンします。
-
-
データ名E
サービスグループ名を31バイト以内のアスキー文字列で設定します。文字列の最後は空白文字を設定してください。
-
データ名F
サービス名を31バイト以内のアスキー文字列で設定します。文字列の最後は空白文字を設定してください。
-
データ名G
CBLDCCLS('CLTIN '),またはCBLDCCLS('EXCLTIN ')で受け取ったクライアントIDを指定します。
-
データ名H
入力パラメタ長(データ名Iの長さ)を設定します。データ名H自身の長さは含みません。1からDCRPC_MAX_MESSAGE_SIZE※までの値が設定できます。
- 注※
-
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
-
データ名I
入力パラメタを設定します。
-
データ名J
応答格納領域長(データ名Kの長さ)を設定します。データ名J自身の長さは含みません。1からDCRPC_MAX_MESSAGE_SIZE※までの値が設定できます。
- 注※
-
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
-
データ名K
応答を格納する領域です。データ名Jで設定する長さ以上の領域を用意してください。
(4) 値が返されるデータ領域
-
データ名B
ステータスコードが,5けたの数字で返されます。
-
データ名D
OpenTP1で使用する領域です。
-
データ名J
応答の長さ(データ名Kの長さ)が返されます。データ名Cに1または33を指定したときは,返されません。
-
データ名K
応答が返されます。データ名Cに1または33を指定したときは,返されません。
(5) ステータスコード
ステータスコード |
意味 |
---|---|
00000 |
正常終了しました。 |
02401 |
データ名に設定した値が間違っています。要求コード(データ名A)が間違っている場合も含みます。 |
02402 |
CBLDCRPS('OPEN ')が実行されていません。 |
02403 |
次のどれかの要因で,このステータスコードが戻りました。
|
02404 |
メモリ不足が発生しました。 |
02406 |
ネットワーク障害が発生しました。 |
02407 |
CBLDCRPS('CALL ')の処理で時間切れ(タイムアウト)が発生しました。 または,サービス要求先のSPPが処理完了前に異常終了しました。 |
02408 |
入力パラメタ長が最大値を超えました。 |
02409 |
返ってきた応答の長さが,CUPで用意した領域を超えています。 |
02410 |
データ名Eに指定したサービスグループ名は定義されていません。 |
02411 |
データ名Fに指定したサービス名は定義されていません。 |
02412 |
データ名Fに指定したサービスが存在するサービスグループは,閉塞されています。 |
02413 |
指定したサービスは終了処理中です。 |
02414 |
サービス要求先のSPPが未起動であるか,または処理完了前に異常終了しました。この値はクライアント環境定義DCWATCHTIMに0を指定(応答無限待ち指定)した場合に戻ります。 |
02415 |
設定したサービスが存在するノードのOpenTP1が実行されていません。 |
02416 |
指定したサービスでシステムエラーが発生しました。 |
02417 |
指定したサービスでメモリ不足が発生しました。 |
02418 |
システムエラーが発生しました。 |
02419 |
サービスプログラムがOpenTP1に返した応答長が1から DCRPC_MAX_MESSAGE_SIZE※までの範囲にありません。 |
02420 |
サービス要求されたノードにあるOpenTP1は開始処理中です。 |
02423 |
メモリ不足が発生しました。 |
02424 |
システムエラーが発生しました。 |
02425 |
指定したサービスでシステムエラーが発生しました。 |
02426 |
返ってきた応答が,CUPで用意した領域に収まりません。 |
02427 |
ノード間負荷バランス機能の環境で,複数のSPPのトランザクション属性が一致していません。 このステータスコードは,ノード間負荷バランス機能を使用しているSPPにサービスを要求した場合にだけ戻ります。 |
02442 |
常設コネクションが解放されました。 |
02456 |
サービス要求先のソケット受信型サーバがサービス要求を受信できません。 |
02466 |
クライアント環境定義DCUTOKEYを指定している環境下で,ユーザサービス定義でtest_mode=noと指定したSPPに対してサービス要求しました。 または,次の条件が重なった環境下から関数を呼び出しています。
|
02467 |
トランザクション処理の連鎖RPCを使ったあとで,データ名Cに32を設定したCBLDCRPS('CALL ')でサービスを要求しています。 |
02470 |
サービス要求先のSPPは,セキュリティ機能で保護されています。 CBLDCRPS('CALL ')を呼び出したUAPには,サーバUAPへのアクセス権限がありません。 |
02472 |
同時に起動できるトランザクションブランチの数を超えたため,トランザクションブランチを開始できません。 または,一つのトランザクションブランチから開始できる子トランザクションブランチの最大数を超えたため,トランザクションブランチを開始できません。 または,トランザクション内でドメイン修飾をしたサービス要求で,データ名Cに32を合わせて設定していません。 |
02478 |
サービス要求先のSPPが処理完了前に異常終了しました。この値はクライアント環境定義DCEXTENDFUNCTIONに00000001を指定した場合に戻ります。00000000を指定しているか指定を省略していると,ステータスコードには02407,または02414が戻ります。 |
02479 |
サービス要求先のTP1/Server Baseのバージョンが古い(03-03以降でない)ため,データ圧縮機能は使用できません。このステータスコードは,トランザクションの範囲内でサービス要求した場合に戻ります。 |
02544 |
データ名Gに指定したクライアントIDはCBLDCCLS('CLTIN '),またはCBLDCCLS('EXCLTIN ')で受け取ったクライアントIDと異なっています。 |
02547 |
指定したポート番号は使用されています。または,OSが自動的に割り当てるポート番号が不足しています。 |
(6) 注意事項
-
入力パラメタ,およびサービスプログラムの応答に同じバッファを指定しないでください。
-
データ名Cに1を指定した場合,次のステータスコードは戻りません。
- 発生しないエラー
-
02409
02419
- 発生しても検出できないエラー
-
02411
02412
02413
02416
02417
02420
-
ステータスコード02407が戻る場合,次に示す要因が考えられます。
-
クライアント環境定義で指定した最大応答待ち時間が短い
-
サービス要求先のSPPから発行したサービスプログラムの異常終了
-
サービス要求先のSPPが存在するノードの障害
-
サービス要求先のSPPの処理完了前での異常終了
-
ネットワーク障害
-
上記の場合,サービス要求先のSPPから開始したトランザクションの処理はコミットされて,データベースが更新されていることがあります。データベースが更新されているかどうかを確認してください。
-
CBLDCTRS('BEGIN ')を実行後,CBLDCRPS('CALL ')を実行して,次に示すステータスコードが戻った場合は,必要があればロールバック要求のプログラムを発行してください。
02407
02411
02417
02419
02423
02424
02425
02426