Hitachi

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


ee_rpc_call_to

〈このページの構成〉

名称

通信先を指定した遠隔サービスの要求

形式

ANSI C,C++の形式

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

機能

特定のSPPにサービスを要求します。サービスを要求するには,ホスト名またはノード識別子を指定したEERPC_BINDING_TBL構造体に加え,「サービスグループ名」と「サービス名」を引数に設定します。EERPC_BINDING_TBL構造体に指定したホスト名またはノード識別子は,サービス要求先を特定する検索のキーとして使用します。この設定に該当するサービス関数へサービスが要求されます。ドメイン修飾をしてサービスを要求することはできません。

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

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

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

UAPで値を設定する引数

●direction

サービス要求先を特定する検索キーを格納するEERPC_BINDING_TBL構造体のアドレスを指定します。検索のキーはホスト名またはノード識別子のどちらかです。

EERPC_BINDING_TBL構造体の形式を次に示します。

struct EERPC_BINDING_TBL {
    char *nid ;             /*ノード識別子格納アドレス*/
    char *hostnm ;          /*ホスト名格納アドレス    */
    unsigned short portno ; /*ポート番号              */
    short filler1 ;         /*予備                    */
    EELONG flags ;          /*属性                    */
    EELONG filler2[4] ;     /*予備                    */
};
  • nid

    ノード識別子を検索キーにする場合,サービス要求先のノード識別子を格納した領域のアドレスを指定します。文字列の最後にはNULL文字を設定してください。このNULL文字は文字列の長さに数えません。

    ノード識別子は,OpenTP1システム共通定義のnode_idオペランドに指定した名称で,かつサービス要求先ノードのホスト名がグローバルドメイン内にあることが前提です。相手先がTP1/EEの場合も親TP1/Server Baseのノード識別子を指定してください。

    ノード識別子を検索のキーにしない場合には,nidにアドレス0を指定してください。

    EERPC_BINDING_TBL構造体のflagsにEERPC_SCDPORTを指定した場合は,nidにアドレス0を指定してください。

  • hostnm

    ホスト名を検索キーにする場合,サービス要求先ノードのホスト名を格納した領域のアドレスを指定します。EERPC_BINDING_TBL構造体のflagsにEENOFLAGS以外を指定した場合は,hostnmを必ず指定してください。

    指定できるホスト名は1〜255文字の文字列です。文字列に使用できる文字は,英数字,ピリオド,およびハイフンです(ただし,IPアドレス形式は除く)。文字列の最後にはNULL文字を設定してください。このNULL文字は文字列の長さに数えません。指定するホスト名は,/etc/hostsファイルまたはDNSなどで,IPアドレスとのマッピングができる名称です。

    なお,サービス要求先ノードのホスト名はグローバルドメインに指定されていても,指定されていなくてもかまいません。

    ホスト名を検索キーにしない場合には,hostnmにアドレス0を指定してください。

  • portno

    ホスト名を検索キーとする場合のポート番号(1〜65535)を指定します。

    EERPC_BINDING_TBL構造体のflagsにEERPC_NAMPORTを指定した場合,サービス要求先ノードのネームサービスのポート番号(TP1/Server Baseのシステム共通定義のname_portオペランドに指定した値)を指定します。

    EERPC_BINDING_TBL構造体のflagsにEENOFLAGSを指定した場合は,サービス要求元のネームサービスのポート番号と,サービス要求先のネームサービスのポート番号が同じであることが前提となります。

    EERPC_BINDING_TBL構造体のflagsにEERPC_SCDPORTを指定した場合,サービス要求先がTP1/Server BaseのSPPのときは,要求先のスケジュールサービスのポート番号を指定します。サービス要求先がTP1/EEのときは,要求先の自サービスグループ定義のmysvgdefオペランドで指定したポート番号を指定します。

    EERPC_BINDING_TBL構造体のflagsにEERPC_SCDPORTを指定し,portnoに0を指定した場合は,送信先ポート番号の省略値として,最初に定義した自サービスグループ情報のmysvgdef定義コマンドに指定したポート番号の値を仮定します。最初に定義したmysvgdef定義コマンドのポート番号に0を指定している場合は,portnoに0を指定できません。

    ノード識別子を検索のキーとする場合は,portnoに指定した値は無視されます。

  • filler1

    0を指定します。

  • flags

    EERPC_NAMPORT

    portnoにネームサービスのポート番号を指定した場合に指定してください。

    EERPC_SCDPORT

    サービス要求先(TP1/Server Base)のスケジュールサービスのポート,またはサービス要求先(TP1/EE)のmysvgdef定義コマンドで指定したポートに対してサービスを要求する場合に指定してください。

    EENOFLAGS

    上記以外の場合に指定してください。

  • filler2

    すべて0を指定します。

●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で定義してあります。

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

注※

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

●flags

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

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

同期応答型RPC

EERPC_NOWAIT

非同期応答型RPC

EERPC_NOREPLY

非応答型RPC

EERPC_TPNOTRAN

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

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

EERPC_NOWAIT_OUTLEN

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

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

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

●out

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

●out_len

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

リターン値

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

リターン値

意味

EE_OKまたは正の整数

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

EECOMER_CNDBPP

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

EECOMER_CNDUOC

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

EECOMER_ENVIRON

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

EERPCER_AGAIN

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

EERPCER_ARGUMENT

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

EERPC_BINDING_TBL構造体のhostnmに指定されたホスト名が,/etc/hostsファイルまたはDNSなどで,IPアドレスとのマッピングができません。

EERPCER_CONDITION

関数の呼び出し条件が不正です。

  • RPC関連定義のname_useオペランドにYが設定されていません。

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

  • UAPリターン後の同期点処理でトランザクション決着できない状態で,かつrpc_replymsg_saveオペランド設定値がN

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

EERPCER_NO_BUFS_RB

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

EERPCER_NO_SERVICE_SOCKET

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

EERPCER_NO_SUCH_SERVICE

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

サービスの要求先がTP1/EEであり,かつ要求先の転送機能が無効(rpc_loadbalanceオペランド設定値がN,かつrpc_transfer_othersvgオペランド設定値がN)の場合は,サービスグループ名が不正のおそれがあります。

EERPCER_NO_SUCH_SERVICE_GROUP

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

EERPC_BINDING_TBL構造体のnidに指定されたノード識別子が,グローバルドメイン(システム共通定義のall_nodeオペランドで指定したノード名の集合)内にありません。

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_to関数の処理が時間切れ(タイムアウト)になりました。

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

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

EERPCER_TRNCHK

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

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

EERPCER_TRNCHK_EXTEND

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

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

EERPC_BINDING_TBL構造体のflagsにEERPC_SCDPORTを指定し,非トランザクション属性(ユーザサービス定義のatomic_updateオペランドに'N'を指定,またはシステム共通定義のjnl_fileless_optionオペランドに'Y'を指定)のTP1/Server Baseユーザサーバに対し,ee_rpc_call_to関数のflagsにEERPC_TPNOTRANとの論理和を指定しないでサービスを要求しました。

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

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

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

注意事項

  1. EERPC_BINDING_TBL構造体にホスト名とノード識別子を同時に指定した場合,ホスト名の指定が有効になり,ノード識別子の指定は無視されます。

  2. EERPC_BINDING_TBL構造体にホスト名,ノード識別子ともに0を指定した場合,ee_rpc_call関数と同様に動作します。

  3. EERPC_BINDING_TBL構造体のflagsにEERPC_SCDPORTを指定し,ソケット受信型(ユーザサービス定義のreceive_fromオペランドにsocketを指定)のTP1/Server Baseユーザサーバへサービスを要求した場合,ee_rpc_call_to関数はEERPCER_SERVICE_NOT_UPでエラーリターンします。

  4. EERPC_BINDING_TBL構造体のflagsにEERPC_SCDPORTを指定して,ee_rpc_call_to関数を呼び出した場合,rpc_retryオペランドは無効になります。

  5. RPC関連定義のname_useオペランドにNを設定して,ee_rpc_call_to関数を呼び出した場合,EERPCER_CONDITIONでエラーリターンします。

  6. リモートAPI機能を使用したRPCはできません。

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

    EECOMER_ENVIRON,EECOMER_CNDUOC,EECOMER_CNDBPP,EERPCER_ARGUMENT,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

  8. その他の注意事項は,ee_rpc_call関数の注意事項を参照してください。