分散トランザクション処理機能 OpenTP1 クライアント使用の手引 TP1/Client/W,TP1/Client/P編

[目次][索引][前へ][次へ]

6.3.3 CBLDCRPS('CALL ')遠隔サービスの要求

<この項の構成>
(1) 形式
(2) 機能
(3) UAPで値を設定するデータ領域
(4) 値が返されるデータ領域
(5) ステータスコード
(6) 注意事項

(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.
 
  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 ')に次の値を指定します。

入力パラメタ,入力パラメタ長,応答の長さは,CUPのCBLDCRPS('CALL ')で指定した値がそのままサービスプログラムに渡されます。応答を返さないサービスプログラムのサービスを呼ぶときは,応答の長さを指定しても無視されます。入力パラメタ長と応答の長さの最大値は,C言語のヘッダファイルdcvrpc.hで規定しているDCRPC_MAX_MESSAGE_SIZEです。

注※
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。
(b) サーバUAPから戻ってくる値

サービスプログラムの処理の終了後に,次の値が参照できます。

データ名Jは,サービスプログラムから実際に返ってきた応答の長さです。同期応答型RPC(データ名Cに0を設定)の場合,CBLDCRPS('CALL ')がリターンしたあと,データ名Kとデータ名Jを参照できます。非応答型RPC(データ名Cに1を設定)の場合,データ名Kとデータ名Jは参照できません。また,CBLDCRPS('CALL ')がエラーリターンした場合もデータ名Kとデータ名Jは参照できません。

返ってきた応答がCUPで確保した応答の領域(データ名K)よりも大きい場合は,ステータスコード02409でエラーリターンします。

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

(4) 値が返されるデータ領域

(5) ステータスコード

ステータスコード 意味
00000 正常終了しました。
02401 データ名に設定した値が間違っています。要求コード(データ名A)が間違っている場合も含みます。
02402 CBLDCRPS('OPEN ')が実行されていません。
02403 次のどれかの要因で,このステータスコードが戻りました。
  • 初期化に失敗しました。
  • ユーザ認証がされていません。
  • クライアント環境定義の指定が誤っています。
02404 メモリ不足が発生しました。
02406 ネットワーク障害が発生しました。
02407 CBLDCRPS('CALL ')の処理で時間切れ(タイムアウト)が発生しました。
または,サービス要求先のSPPが処理完了前に異常終了しました。
02408 入力パラメタ長が最大値を超えました。
02409 返ってきた応答の長さが,CUPで用意した領域を超えています。
02410 データ名Fに指定したサービスグループ名は定義されていません。
02411 データ名Eに指定したサービス名は定義されていません。
02412 データ名Eに指定したサービスが存在するサービスグループは,閉塞されています。
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に対してサービス要求しました。
または,次の条件が重なった環境下から関数を呼び出しています。
  • クライアント環境定義DCUTOKEYを指定しています。
  • CUP実行プロセスとの常設コネクションが確立中です。
  • トランザクションの範囲外です。
  • ユーザサービス定義で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が自動的に割り当てるポート番号が不足しています。
注※
クライアント環境定義DCCLTRPCMAXMSGSIZEに2以上を指定した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,クライアント環境定義DCCLTRPCMAXMSGSIZEに指定した値になります。

(6) 注意事項

上記の場合,サービス要求先のSPPから開始したトランザクションの処理はコミットされて,データベースが更新されていることがあります。データベースが更新されているかどうかを確認してください。