Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引


CBLEERPC('CALL ')

〈このページの構成〉

名称

遠隔サービスの要求

形式

PROCEDURE DIVISIONの指定

CALL 'CBLEERPC' 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 9(9) COMP.
  02 データ名H  PIC X(n).
01 一意名3.
  02 データ名I  PIC 9(9) COMP.
  02 データ名J  PIC X(n).

機能

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

サービスを要求するときには,「サービスグループ名」と「サービス名」をCBLEERPC('CALL ')のデータ領域に設定します。この名称に該当するサービスプログラムへサービスが要求されます。ドメイン修飾をしてサービスを要求することはできません。

CBLEERPC('CALL ')を使う場合,サーバUAPがあるノードのTP1/Server BaseまたはTP1/EEが稼働していることが前提です。

【TP1/FSP限定】RPC関連定義のrpc_output_messageオペランドが設定されている場合,またはユーザサービス関連定義のservice_attr定義コマンドが設定されている場合に,送信データをUAP履歴情報のデータ種別「OJ(出力メッセージ)」として取得します。

オペランドについては,TP1/FSPの関連ドキュメントを参照してください。

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

●データ名A

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

●データ名C

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

0

同期応答型RPC

1

非応答型RPC

2

非同期応答型RPC

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

自プロセス送信(通信レス)を行う場合,RPCの形態を示す数値に「131072」を加算します。「131072」を加算する場合は,必ず「32」も加算してください。

非同期応答型RPCで,サービス関数が設定した応答の長さを参照したい場合は,RPCの形態を示す数値に「512」を加算します。その場合は,CBLEERPC('POLLANYR')の正常終了時に,CBLEERPC('CALL')のサービス応答とサービス応答の長さに,サービス関数が設定した応答と応答の長さがそれぞれ設定されます。「512」を加算しない場合は,サービス応答だけ設定されます。

【XTC限定】サーバとの通信を,コネクションレス(UDPプロトコル)で行う場合は,RPCの形態を示す数値に「4096」を加算します。「4096」を加算する場合は,必ず「32」も加算してください。

(例1)

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

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

(例2)

非同期応答型RPCで自プロセス宛てでサービス要求をする場合

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

(例3)

非同期応答型RPCでコネクションレス(UDPプロトコル)を使用して,サービス要求をする場合

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

●データ名E

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

●データ名F

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

●データ名G

サービスの入力パラメタ長(データ名Hの長さ)を設定します(単位:バイト)。1〜EERPC_MAX_MESSAGE_SIZE_EXの範囲の値を指定できます。EERPC_MAX_MESSAGE_SIZE_EXは,eerpc.hで定義してあります。

サービス要求先がTP1/EEの場合,相手先のTP1/EEのIMAサイズ以下の値を設定してください。

注※

従来のEERPC_MAX_MESSAGE_SIZEは,eerpc.hで定義してありますが,EERPC_MAX_MESSAGE_SIZE_EXの使用をお勧めします。

●データ名H

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

●データ名I

サービスの応答の長さ(データ名Jの長さ)を設定します(単位:バイト)。1〜EERPC_MAX_MESSAGE_SIZE_EXの範囲の値を指定できます。EERPC_MAX_MESSAGE_SIZE_EXは,eerpc.hで定義してあります。

サービス要求先がTP1/EEの場合,相手先のTP1/EEのOMAサイズ以下の値を設定してください。

非応答型RPCの場合も,サービスの応答の長さを設定した領域のアドレスを指定する必要があります。この場合,サービスの応答の長さには,0を設定します。

注※

従来のEERPC_MAX_MESSAGE_SIZEは,eerpc.hで定義してありますが,EERPC_MAX_MESSAGE_SIZE_EXの使用をお勧めします。

TP1/EEから値が返されるデータ領域

●データ名B

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

●データ名D

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

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

●データ名I

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

●データ名J

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

サーバUAPから返される値

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

データ名Jまたはデータ名Iを参照できる場合を次に示します。

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

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

ステータスコード

ここで示すステータスコードは,TP1/EEが返す値です。サービスプログラムが返す値ではありません。

ステータスコード

意味

00000

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

00001

TP1/EEの環境下にありません。

00004

UOCから発行しているため,この機能は使用できません。

00005

オフラインバッチプロセスから発行しているため,この機能は使用できません。

00301

要求コード(データ名A)が間違っています。

00304

メモリが不足しました。要求先がTP1/EEの場合は,データ名Iの設定値がOMAサイズを超過しているおそれがあります。

00305

ネットワークの障害などによってサービス要求できるコネクションの取得に失敗しました。

00306

ネットワークに障害が起こりました。

00307

処理が時間切れ(タイムアウト)になりました。

サービスを要求されたSPPが,処理を完了する前に異常終了しました。

非トランザクショナルRPC(データ名Cに32以上を設定)の要求先サーバがTP1/EEであり,かつサーバ側のRPC関連定義のrpc_reply_tp1mode_downオペランドの指定値がJの場合,サーバ側のトランザクション決着結果がロールバック以外になりました。

00308

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

00309

返ってきた応答が,クライアントUAPで用意した領域に収まりません。

00310

データ名Fに設定したサービスグループ名は,定義されていません。

00311

データ名Eに設定したサービス名は,定義されていません。

データ名Fに設定したサービスグループ名が,サービス要求先プロセスのサービスグループ名と異なります。次の条件をすべて満たす場合に発生します。

  • サービスグループ情報関連定義のeesvgdef定義コマンドで登録したサービスグループを指定している

  • RPCの形態として同期応答型RPCを指定している

  • サービスの要求先がTP1/EEで,かつ要求先の転送機能が無効(RPC関連定義のrpc_loadbalanceオペランド,およびrpc_transfer_othersvgオペランドにNを指定)になっている

00312

データ名Eに設定したサービス名があるサービスグループは,閉塞しています。

00313

データ名Eに設定したサービスは,終了処理中です。

00314

データ名Eに設定したサービスのUAPプロセスが,稼働していません。

サービス要求の応答待ち時間に0を指定した場合に,サービスを要求されたSPPが,処理を完了する前に異常終了しました。

00315

データ名Eに設定したサービスがあるノードのTP1/Server BaseまたはTP1/EEが稼働していません。異常終了,停止中,終了処理中,および通信障害が起こったことが考えられます。

00316

設定したサービスで,システムエラーが起こりました。

00317

設定したサービスで,メモリが不足しました。

非トランザクショナルRPC(データ名Cに32以上を設定)の要求先サーバがTP1/EEであり,かつサーバ側のRPC関連定義のrpc_reply_tp1modeオペランドまたはrpc_reply_tp1mode_downオペランドの指定値がNの場合,サーバ側のトランザクションがコミットしましたが,応答を返せませんでした。次に示す原因が考えられます。

  • UAPリターン後の同期点処理でトランザクション決着できなかった,かつ,RPC関連定義のrpc_replymsg_saveオペランドにNを指定した

  • UAPリターン後の同期点処理以降にプロセスダウンした

00318

システムエラーが起こりました。

00319

サービスプログラムがTP1/EEに返した応答の長さが,1〜EERPC_MAX_MESSAGE_SIZE_EXで定義されている値の範囲にありません。

00320

サービスを要求されたノードにあるTP1/Server BaseまたはTP1/EEは,開始処理中です。

00323

メモリが不足しました。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00324

システムエラーが起こりました。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00325

設定したサービスで,システムエラーが起こりました。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00326

返ってきた応答が,クライアントUAPで用意した領域に収まりません。このステータスコードが返った場合は,トランザクションブランチをコミットできません。

00327

ノード間負荷バランス機能およびノード間負荷バランス拡張機能の環境で,複数のSPPのトランザクション属性が一致していません。または,負荷を分散する先のノードにあるTP1/Server BaseまたはTP1/EEのバージョンが,クライアントのTP1/Server BaseまたはTP1/EEのバージョンよりも古いため,ノード間負荷バランス機能およびノード間負荷バランス拡張機能を実行できません。

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

00331

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

00332

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

00334

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

00336

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

00337

データ名Cに設定した値が間違っています。または,値の組み合わせが不正です。

00338

rpc_tcp_communication_useオペランドにNを指定しているため,TCP/IPを使用してRPC要求できません。

終了トランザクション(ME)からトランザクショナルRPCでサービスを要求しています。

初期化トランザクション(MI),または終了トランザクション(ME)から自プロセス通信(通信レス)でサービスを要求しています。

00339

サービスを要求されたSPPのメッセージ格納領域に十分な空きがないため,サービス要求を受け付けられません。

00340

非同期応答型RPCの場合は,rpc_nowait_cntオペランドで指定した,同時要求最大数をオーバしました。

00356

サービスを要求されたソケット受信型サーバが,サービス要求を受け取れません。

00366

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

00370

リモートAPI機能を使用した場合に,代理実行要求先で発生したエラーリターンです。エラーリターンの原因は,代理実行要求先のマニュアルを参照してください。

00372

同時に起動できるトランザクションブランチの数を超えたため,トランザクションブランチを開始できません。

一つのトランザクションブランチから開始できる子トランザクションブランチの最大数を超えたため,トランザクションブランチを開始できません。

リソースマネジャでエラーが発生したため,トランザクションブランチを開始できません。

非トランザクショナルRPC(データ名Cに32以上を設定)の要求先サーバがTP1/EEであり,かつサーバ側のRPC関連定義のrpc_reply_tp1modeオペランドまたはrpc_reply_tp1mode_downオペランドの指定値がNの場合,サーバ側のトランザクションがコミットできませんでした。

非トランザクショナルRPC(データ名Cに32以上を設定)の要求先サーバがTP1/EEであり,かつサーバ側のRPC関連定義のrpc_reply_tp1mode_downオペランド指定値がJの場合,サーバ側のトランザクションがロールバックしました。

00378

リモートAPI機能を使用した場合に,代理実行要求先で発生したエラーリターンです。エラーリターンの原因は,代理実行要求先のマニュアルを参照してください。

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

CBLEERPC('CALL ')がエラーリターンする場合について説明します。

サービス要求先が稼働していない場合,または送信できるコネクションがない場合

CBLEERPC('CALL ')は「00305」でエラーリターンします。

サービス要求先コネクション確立後,サービス要求時にネットワーク障害を検知した場合

CBLEERPC('CALL ')は「00306」でエラーリターンします。

ネームサービスを使用しない場合で,サービスグループ情報関連定義のeesvgdef定義コマンドにサーバUAPのサービスグループ名が設定されていないとき

ネームサービスを使用しない場合は,サービスグループ情報関連定義のeesvgdef定義コマンドの指定値を基にサービス要求先を取得します。eesvgdef定義コマンドにサーバUAPのサービスグループ名が設定されていない場合,CBLEERPC('CALL ')は「00310」でエラーリターンします。

ネームサービスを使用する場合で,該当するサービスグループ名が見つからなかったとき

ネームサービスを使用する場合は,RPC関連定義のrpc_destination_modeオペランドの指定値に従ってサービス要求先を取得します。該当するサービスグループ名が見つからなかった場合,CBLEERPC('CALL ')は「00310」でエラーリターンします。

サービス要求時にメッセージ格納領域(TCP/IPバッファ)不足がリトライ回数を超えて連続で発生した場合

CBLEERPC('CALL ')は「00339」でエラーリターンします。サービス要求のリトライ回数は,RPC関連定義のrpc_router_retry_countオペランドで指定します。サービス要求のリトライ間隔は,RPC関連定義のrpc_router_retry_intervalオペランドで指定します。そのほか,RPC関連定義のipc_sendbuf_sizeオペランドやサービス要求先のTCP/IPバッファの定義(RPC関連定義,TP1/Server Baseのユーザサービス定義またはシステム共通定義のipc_recvbuf_sizeオペランド)などを見直してください。

注意事項

  1. データ領域に設定するサービスグループ名およびサービス名は,サーバUAPの環境設定で設定しておいてください。

  2. 次のトランザクションの場合は,自TP1/EEのサービスグループ名を指定したRPCはできません。

    • 初期化トランザクション(MI)

    • 終了トランザクション(ME)

    • 共有リソース初期化トランザクション(JI)

    • システム開始時のユーザ初期化トランザクション(UT)

    • 実行系連絡トランザクション(UI)(ただし,データ名Cに131072を指定している場合だけ,自TP1/EEのサービスグループ名を指定したRPCができます)

  3. 終了トランザクション(ME)では,トランザクショナルRPCはできません。

  4. 初期化トランザクション(MI)からのトランザクショナルRPCは実行しないでください。通常起動(再起動ではない起動)でTP1/EEを起動した場合で,初期化トランザクションからのトランザクショナルRPCの処理中にプロセスダウンしたとき,TP1/EEは再び通常起動で起動されます。このとき,プロセスダウン前の仕掛り中トランザクションは,回復処理の対象外となります。回復処理の対象外となったトランザクションは,サービス要求先でコマンドを実行することによって強制的に決着させることしかできなくなる場合があります。

  5. 非同期応答型RPCを連続して使用したあと応答を受け取る場合は,非同期応答型RPCのサービスを要求するときに,それぞれ異なる応答格納領域(データ名J)および応答の長さを格納する領域(out_len)を設定してください。同じ領域を設定すると,あとから来た応答に上書きされてしまい,応答を正しく受け取れなくなります。

  6. 【TP1/FSP限定】次のステータスコードの場合,出力メッセージ(OJ)は取得されません。

    00001,00004,00005,00301,00308,00331,00332,00334,00336,00337

  7. 非同期応答型RPCの応答格納領域は,次に示す方法で非同期応答型RPCを終了するまで解放しないでください。

    • CBLEERPC('POLLANYR')関数で応答を受け取る

    • CBLEERPC('DISCARDF')関数またはCBLEERPC('DISCARDS')関数で応答の受信を拒否する

    • トランザクショナルRPCの場合,同期点処理の関数でコミットまたはロールバックする