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)
outまたはout_lenを参照できる場合を次に示します。
-
同期応答型RPCの場合
ee_rpc_call関数がリターンしたあと,outおよびout_lenを参照できます。
-
非同期応答型RPCの場合
ee_rpc_poll_any_replies関数が該当する応答を受け取ってリターンしたあと,outを参照できます。EERPC_NOWAIT_OUTLENを指定していない場合,out_lenは参照できません。
-
非応答型RPCの場合
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の場合,サーバ側のトランザクションがコミットしましたが,応答を返せませんでした。次に示す原因が考えられます。
|
|
EERPCER_NO_BUFS_RB |
メモリが不足しました。このリターン値が返った場合は,トランザクションブランチをコミットできません。 |
EERPCER_NO_SERVICE_SOCKET |
ネットワークの障害などによってサービス要求できるコネクションの取得に失敗しました。 |
EERPCER_NO_SUCH_SERVICE |
serviceに設定したサービス名は,定義されていません。 |
groupに設定したサービスグループ名が,サービス要求先プロセスのサービスグループ名と異なります。次の条件をすべて満たす場合に発生します。
|
|
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オペランド)などを見直してください。
注意事項
-
引数に設定するサービスグループ名およびサービス名は,サーバUAPの環境設定で設定しておいてください。
-
次のトランザクションの場合は,自TP1/EEのサービスグループ名を指定したRPCはできません。
-
初期化トランザクション(MI)
-
終了トランザクション(ME)
-
共有リソース初期化トランザクション(JI)
-
システム開始時のユーザ初期化トランザクション(UT)
-
実行系連絡トランザクション(UI)(ただし,flagsにEERPC_CALL_MYPROCを指定している場合だけは,自TP1/EEのサービスグループ名を指定したRPCができます)
-
-
終了トランザクション(ME)では,トランザクショナルRPCはできません。
-
初期化トランザクション(MI)からのトランザクショナルRPCは実行しないでください。通常起動(再起動ではない起動)でTP1/EEを起動した場合で,初期化トランザクションからのトランザクショナルRPCの処理中にプロセスダウンしたとき,TP1/EEは再び通常起動で起動されます。このとき,プロセスダウン前の仕掛り中トランザクションは,回復処理の対象外となります。回復処理の対象外となったトランザクションは,サービス要求先でコマンドを実行することによって強制的に決着させることしかできなくなる場合があります。
-
非同期応答型RPCを連続して使用したあと応答を受け取る場合は,非同期応答型RPCのサービスを要求するときに,それぞれ異なる応答格納領域(out)および応答の長さを格納する領域(out_len)を設定してください。同じ領域を設定すると,あとから来た応答に上書きされてしまい,応答を正しく受け取れなくなります。
-
【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
-
非同期応答型RPCの応答格納領域(out)および応答の長さを格納する領域(out_len)は,次に示す方法で非同期応答型RPCを終了するまで解放しないでください。
-
ee_rpc_poll_any_replies関数で応答を受け取る
-
ee_rpc_discard_further_replies関数またはee_rpc_discard_specific_reply関数で応答の受信を拒否する
-
トランザクショナルRPCの場合,同期点処理の関数でコミットまたはロールバックする
-