Hitachi

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


ee_rpc_call

〈このページの構成〉

名称

遠隔サービスの要求

形式

ANSI C,C++の形式

#include <eerpc.h>
int ee_rpc_call(char *group, char *service, char *in, 
                EEULONG *in_len, char *out, EEULONG *out_len, 
                EELONG flags)

機能

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

サービスを要求するときには,「サービスグループ名」と「サービス名」を引数に設定します。この名称に該当するサービス関数へサービスが要求されます。ドメイン修飾をしてサービスを要求することはできません。

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

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

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

UAPで値を設定する引数

●group

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

●service

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

●in

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

●in_len

サービスの入力パラメタ長を設定します(単位:バイト)。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の使用をお勧めします。

●out

サービス関数から返ってくる応答を格納する領域を設定します。outに設定した領域に,サービス関数からの応答が設定されます。

●out_len

サービスの応答の長さを設定します(単位:バイト)。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の使用をお勧めします。

●flags

RPCの形態とオプションを次に示す形式で設定します。

{EENOFLAGS|EERPC_NOWAIT|EERPC_NOREPLY}〔|EERPC_TPNOTRAN〕〔|EERPC_CALL_MYPROC〕〔|EERPC_NOWAIT_OUTLEN〕〔|EERPC_UDP〕
EENOFLAGS

同期応答型RPC

EERPC_NOWAIT

非同期応答型RPC

EERPC_NOREPLY

非応答型RPC

EERPC_TPNOTRAN

トランザクション処理からのサービス要求で,要求先の処理をトランザクションにしない場合に設定します。

この値はRPCの形態との論理和で設定してください。

EERPC_CALL_MYPROC

groupに自サービスグループ名を設定したときに自プロセス送信(通信レス)を行う場合に指定します。

EERPC_CALL_MYPROCを指定する場合は,必ずEERPC_TPNOTRANと論理和で設定してください。

EERPC_UDPと論理和で設定することはできません。

EERPC_NOWAIT_OUTLEN

非同期応答型RPCで,サービス関数が設定した応答の長さを参照したい場合に設定します。EERPC_NOWAIT_OUTLENを設定した場合,ee_rpc_poll_any_replies関数の正常終了時,ee_rpc_call関数で設定したoutとout_lenに,サービス関数が設定した応答と応答の長さがそれぞれ設定されます。EERPC_NOWAIT_OUTLENを設定しない場合,outだけ設定されます。

EERPC_NOWAIT_OUTLENはEERPC_NOWAITと論理和で指定してください。EERPC_NOWAITを指定していない場合,EERPC_NOWAIT_OUTLENは無視されます。

EERPC_UDP  【XTC限定】

サーバとの通信をコネクションレス(UDPプロトコル)で行う場合に設定します。

この値はRPCの形態との論理和で設定してください。EERPC_UDPを設定する場合は必ずEERPC_TPNOTRANとの論理和で設定してください。

サーバUAPから値が返される引数

●out

サービス関数が設定した応答が返されます。

●out_len

サービス関数が設定した応答の長さが返されます(単位:バイト)。

サーバUAPから返される値

サービス関数の処理が終了して応答が返ってくると,次の値を参照できます。

outまたはout_lenを参照できる場合を次に示します。

ee_rpc_call関数,またはee_rpc_poll_any_replies関数がエラーリターンした場合は,outおよびout_lenは参照できません。

返ってきた応答が,クライアントUAPで用意した応答の領域(out)よりも大きい場合は,EERPCER_REPLY_TOO_BIGでエラーリターンします。

リターン値

ここで示すリターン値は,TP1/EEが返す値です。サービス関数から返される値ではありません。

リターン値

意味

EE_OKまたは正の整数

正常に終了しました。非同期応答型RPCの場合は,正の整数は記述子です。

EECOMER_CNDBPP

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

EECOMER_CNDUOC

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

EECOMER_ENVIRON

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

EERPCER_AGAIN

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

EERPCER_CONDITION

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

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

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

EERPCER_INVALID_REPLY

サービス関数がOpenTP1に返した応答の長さが,1〜EERPC_MAX_MESSAGE_SIZE_EXで定義されている値の範囲にありません。

EERPCER_LIMITS_OVER

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

EERPCER_MEMORY_SHORT

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

EERPCER_MESSAGE_TOO_BIG

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

EERPCER_NET_DOWN

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

EERPCER_NO_BUFS_AT_SERVER

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

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

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

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

EERPCER_NO_BUFS_RB

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

EERPCER_NO_SERVICE_SOCKET

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

EERPCER_NO_SUCH_SERVICE

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

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

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

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

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

EERPCER_NO_SUCH_SERVICE_GROUP

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

EERPCER_OLTF_INITIALIZING

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

EERPCER_OLTF_NOT_UP

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

EERPCER_PARAM_FLAGS

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

EERPCER_PARAM_GROUP

groupに設定した値が間違っています。

EERPCER_PARAM_IN

inに設定した値が間違っています。

EERPCER_PARAM_IN_LEN

in_lenに設定した値が間違っています。

EERPCER_PARAM_OUT

outに設定した値が間違っています。

EERPCER_PARAM_OUT_LEN

out_lenに設定した値が間違っています。

EERPCER_PARAM_SERVICE

serviceに設定した値が間違っています。

EERPCER_REPLY_TOO_BIG

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

EERPCER_REPLY_TOO_BIG_RB

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

EERPCER_SECCHK

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

EERPCER_SERVER_BUSY

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

EERPCER_SERVICE_CLOSED

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

EERPCER_SERVICE_NOT_UP

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

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

EERPCER_SERVICE_TERMINATED

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

EERPCER_SERVICE_TERMINATING

serviceに設定したサービスは,終了処理中です。

EERPCER_SYSERR

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

EERPCER_SYSERR_AT_SERVER

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

EERPCER_SYSERR_AT_SERVER_RB

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

EERPCER_SYSERR_RB

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

EERPCER_TESTMODE

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

EERPCER_TIMED_OUT

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

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

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

EERPCER_TRNCHK

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

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

EERPCER_TRNCHK_EXTEND

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

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

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

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

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

ee_rpc_call関数がエラーになる場合

ee_rpc_call関数がエラーリターンする場合について説明します。

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

ee_rpc_call関数はEERPCER_NO_SERVICE_SOCKETのリターン値でエラーリターンします。

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

ee_rpc_call関数はEERPCER_NET_DOWNのリターン値でエラーリターンします。

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

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

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

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

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

ee_rpc_call関数はEERPCER_AGAINのリターン値でエラーリターンします。サービス要求のリトライ回数は,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)(ただし,flagsにEERPC_CALL_MYPROCを指定している場合だけは,自TP1/EEのサービスグループ名を指定したRPCができます)

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

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

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

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

    EECOMER_ENVIRON,EECOMER_CNDUOC,EECOMER_CNDBPP,EERPCER_PARAM_GROUP,EERPCER_PARAM_SERVICE,EERPCER_PARAM_IN,EERPCER_PARAM_IN_LEN,EERPCER_PARAM_OUT,EERPCER_PARAM_OUT_LEN,EERPCER_PARAM_FLAGS,EERPCER_MESSAGE_TOO_BIG

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

    • ee_rpc_poll_any_replies関数で応答を受け取る

    • ee_rpc_discard_further_replies関数またはee_rpc_discard_specific_reply関数で応答の受信を拒否する

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