Hitachi

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


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で値を設定するデータ領域

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

(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に対してサービス要求しました。

または,次の条件が重なった環境下から関数を呼び出しています。

  • クライアント環境定義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から開始したトランザクションの処理はコミットされて,データベースが更新されていることがあります。データベースが更新されているかどうかを確認してください。