Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス C言語編


dc_rpc_call

〈このページの構成〉

名称

遠隔サービスの要求

形式

ANSI C ,C++の形式

#include <dcrpc.h>
int  dc_rpc_call(char *group,char *service,char *in,
                 DCULONG *in_len,char *out,DCULONG *out_len,
                 DCLONG flags)

K&R版 C の形式

#include <dcrpc.h>
int dc_rpc_call(group,service,in,in_len,out,out_len,flags)
char      *group;
char      *service;
char      *in;
DCULONG   *in_len;
char      *out;
DCULONG   *out_len;
DCLONG    flags;

機能

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

サービスを要求するときには,「サービスグループ名」「サービス名」を dc_rpc_call関数の引数に設定します。この名称に該当するサービス関数へサービスが要求されます。

dc_rpc_call関数を呼び出すUAPは,トランザクションとして実行していても,していなくてもかまいません。トランザクションとして実行している処理からdc_rpc_call関数でサービスを要求するときは,要求するサービスの処理はトランザクションブランチとして稼働します。dc_rpc_call関数を使う場合,サーバUAPがあるノードのOpenTP1が稼働していることが前提です。

dc_rpc_call関数を実行して応答を待っている間にシグナルを受信しても,関数はリターンされません。

リターン値の一覧のあとに,次の説明を掲載しています。dc_rpc_call関数の詳しい説明を知りたいときに参照してください。

(1)dc_rpc_call関数の引数について

(2)dc_rpc_call関数がエラーになる場合

(3)dc_rpc_call関数がエラーになるタイミング

(4)dc_rpc_call関数がエラーになったときに再実行する指定

(5)サービス要求に優先度を付ける場合

(6)リターン値DCRPCER_NO_SUCH_SERVICE_GROUPとDCRPCER_NET_DOWNの違い

(7)リターン値DCRPCER_SERVICE_TERMINATEDをリターンさせる指定

(8)エラーリターン値と同期点処理の関係

(9)サービスを要求するときの注意

(10)ドメイン修飾をしてサービスを要求する場合

UAPで値を設定する引数

●group

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

ドメイン修飾をしてサービスを要求するときは,サービスグループ名の後ろに@(アットマーク)とDNSのドメイン名を付けて,文字列の最後にはヌル文字を設定してください。

●service

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

●in

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

●in_len

サービスの入力パラメタ長を設定します。1からDCRPC_MAX_MESSAGE_SIZEまでの範囲の長さが設定できます。DCRPC_MAX_MESSAGE_SIZEは,dcrpc.hで定義してあります。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

●out

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

●out_len

サービスの応答の長さを設定します。1からDCRPC_MAX_MESSAGE_SIZEまでの範囲の長さが設定できます。DCRPC_MAX_MESSAGE_SIZEは,dcrpc.hで定義してあります。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

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

●flags

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

{DCNOFLAGS|DCRPC_NOWAIT|DCRPC_NOREPLY|DCRPC_CHAINED}〔|DCRPC_TPNOTRAN〕〔|DCRPC_DOMAIN〕
DCNOFLAGS

同期応答型RPC

DCRPC_NOWAIT

非同期応答型RPC

DCRPC_NOREPLY

非応答型RPC

DCRPC_CHAINED

連鎖RPC

DCRPC_TPNOTRAN

トランザクション処理からのサービス要求で,要求先の処理をトランザクションにしない場合に設定します。DCRPC_TPNOTRANを設定すると,トランザクションの処理からのサービス要求でも,サービス関数の処理はトランザクションになりません。

DCRPC_DOMAIN

サービスグループ名をドメイン修飾した場合に指定します。ドメイン修飾をしたRPCはトランザクションブランチにできません。そのため,トランザクションの処理からdc_rpc_call関数を使う場合は,必ずDCRPC_TPNOTRANと一緒に指定してください。

DCRPC_TPNOTRANとDCRPC_DOMAINは,RPCの形態に付けて設定します。

(例1)

同期応答型RPCでトランザクションにしないサービス要求をする場合,flagsには「DCNOFLAGS|DCRPC_TPNOTRAN」と設定します。

(例2)

トランザクションの処理から,同期応答型RPCでドメイン修飾をしたサービス要求をする場合,flagsには「DCNOFLAGS|DCRPC_TPNOTRAN|DCRPC_DOMAIN」と設定します。

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

●out

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

●out_len

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

リターン値

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

リターン値

リターン値(数値)

意味

0または正の整数

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

DCRPCER_INVALID_ARGS

-301

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

DCRPCER_PROTO

-302

dc_rpc_open関数を呼び出していません。

非オートコネクトモード(ユーザサービス定義のrpc_rap_auto_connectオペランドにNを指定)でリモートAPI機能を使用時にdc_rap_connect関数を呼び出していません。

DCRPCER_NO_BUFS

-304

メモリが不足しました。または,サービス要求先SPPのメッセージ格納バッファプール(message_store_buflenオペランド)が不足したため,サービス要求を受け付けられませんでした。

サービス要求先SPPのユーザサービス定義,またはユーザサービスデフォルト定義のmessage_store_buflenオペランドの指定値を見直してください。

DCRPCER_NET_DOWN

-306

通信障害が起こりました。

ネットワークに障害が発生していないか確認してください。

リモートAPI機能を使用している場合は,dc_rpc_call関数の応答待ち時間を満了した可能性があります。

dc_rpc_call関数の応答待ち時間の設定(watch_timeオペランド,dc_rpc_set_watch_time関数の引数)を見直してください。

リモートAPI機能使用時にdc_rpc_call関数の応答待ち時間を満了した場合のリターン値をDCRPCER_TIMED_OUTに変更するには,ユーザサービス定義にrap_extend_functionオペランドを指定してください。rap_extend_functionオペランドについてはマニュアル「OpenTP1 システム定義」を参照してください。

DCRPCER_TIMED_OUT

-307

dc_rpc_call関数の応答待ち時間を満了しました。

dc_rpc_call関数の応答待ち時間の設定(watch_timeオペランド,dc_rpc_set_watch_time関数の引数)を見直してください。

サービス要求先SPPが,サービス関数の実行中に異常終了しました。

サービス要求先SPPが異常終了した要因を調査してください。

接続済みのコネクションでメッセージの吸い込みが発生しました。サービス要求先のOpenTP1がオンラインであることを確認し,再度dc_rpc_call関数を呼び出してください。

DCRPCER_MESSAGE_TOO_BIG

-308

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

in_lenの設定値を見直してください。

DCRPCER_REPLY_TOO_BIG

-309

サービス要求先SPPのサービス関数で設定した応答の長さ(out_len)が,dc_rpc_call関数の応答の長さ(out_len)を超えました。

サービス要求先SPPのサービス関数での応答の長さ(out_len)の設定を見直してください。

DCRPCER_NO_SUCH_SERVICE_GROUP

-310

groupに設定したサービスグループ名が不正であるか,groupに設定したサービスグループのサービス要求先SPPが起動されていません。

groupの設定を見直すか,groupに設定したサービスグループのサービス要求先SPPを起動してください。

DCRPCER_NO_SUCH_SERVICE

-311

serviceに設定したサービス名が不正であるか,サービス要求先SPPでserviceに設定したサービス名がユーザサービス定義ファイルのserviceオペランドに設定されていません。

serviceの設定を見直すか,serviceに設定したサービス名をサービス要求先SPPのserviceオペランドに設定してください。

DCRPCER_SERVICE_CLOSED

-312

groupで設定したサービスグループのサービス要求先SPPは,サーバ閉塞またはサービス閉塞しています。

閉塞要因を調査し,閉塞を解除してください。

DCRPCER_SERVICE_TERMINATING

-313

サービス要求先SPPは,終了処理中です。

DCRPCER_SERVICE_NOT_UP

-314

groupに設定したサービスグループ名のサービス要求先SPPは起動していません。または,サービス要求送信処理で通信障害が起きたおそれがあります。

groupに設定したサービスグループ名のサービス要求先SPPを起動してください。すでに起動している場合は,ネットワーク障害が発生していないかを確認してください。

サービス要求の応答待ち時間(watch_timeオペランド,dc_rpc_set_watch_time関数の引数)に0を指定している場合に,サービス関数を実行中のサービス要求先SPPが異常終了しました。

サービス要求先SPPが異常終了した要因を調査してください。

DCRPCER_OLTF_NOT_UP

-315

サービス要求先SPPのOpenTP1が起動していません。OpenTP1が停止処理中であるか,サービス要求送信処理で通信障害が起きたおそれがあります。

サービス要求先SPPのOpenTP1を起動するか,ネットワーク障害が発生していないかどうかを確認してください。

DCRPCER_SYSERR_AT_SERVER

-316

サービス要求先SPPで,システムエラー(内部矛盾)が起こりました。

DCRPCER_NO_BUFS_AT_SERVER

-317

サービス要求先SPPで,メモリが不足しました。

DCRPCER_SYSERR

-318

サービス要求元UAPで,システムエラー(内部矛盾)が起こりました。

DCRPCER_INVALID_REPLY

-319

サービス要求先SPPのサービス関数で設定する応答の長さ(out_len)が,1からDCRPC_MAX_MESSAGE_SIZEで定義されている値の範囲にありません。

サービス要求先SPPのサービス関数内の応答の長さ(out_len)の設定を見直してください。

DCRPCER_OLTF_INITIALIZING

-320

サービス要求先SPPのOpenTP1は,開始処理中です。

DCRPCER_NO_BUFS_RB

-323

サービス要求元UAP,またはサービス要求先SPPで,メモリが不足しました。このリターン値が返った場合,トランザクションブランチはロールバックします。

サービス要求元UAP,またはサービス要求先SPPで,不要なメモリを確保していないか見直してください。

DCRPCER_SYSERR_RB

-324

サービス要求元UAPで,システムエラー(内部矛盾)が起こりました。このリターン値が返った場合,トランザクションブランチはロールバックします。

DCRPCER_SYSERR_AT_SERVER_RB

-325

サービス要求先SPPで,システムエラー(内部矛盾)が起こりました。このリターン値が返った場合,トランザクションブランチはロールバックします。

DCRPCER_REPLY_TOO_BIG_RB

-326

サービス要求先SPPのサービス関数で設定した応答の長さ(out_len)が,dc_rpc_call関数の応答の長さ(out_len)を超えました。このリターン値が返った場合,トランザクションブランチはロールバックします。

サービス要求先SPPのサービス関数で,応答の長さ(out_len)の設定を見直してください。

DCRPCER_TRNCHK

-327

ノード間負荷バランス機能,およびノード間負荷バランス拡張機能を使用している場合に,同一サービスグループ名のサービス要求先SPPのトランザクション属性(atomic_updateオペランド)が不一致になっています。または,負荷を分散する先のノードにあるOpenTP1のバージョンが,要求元UAPのOpenTP1のバージョンよりも古いため,ノード間負荷バランス機能,およびノード間負荷バランス拡張機能を実行できません。

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

ノード間負荷バランス機能,およびノード間負荷バランス拡張機能を使用するSPPのトランザクション属性(atomic_updateオペランド),またはOpenTP1のバージョンを見直してください。

dcsvgdef定義コマンドを使用して,非トランザクション属性(ユーザサービス定義のatomic_updateオペランドに'N'を指定,またはシステム共通定義のjnl_fileless_optionオペランドに'Y'を指定)のユーザサーバに対し,dc_rpc_call関数のflagsにDCRPC_TPNOTRANとの論理和を指定しないでサービスを要求しました。

dcsvgdef定義コマンドまたは,dc_rpc_call関数のflagsを見直してください

DCRPCER_NO_SUCH_DOMAIN

-328

groupのドメイン修飾をしたサービスグループ名のドメイン名が間違っています。

ドメイン名を見直してください。

DCRPCER_NO_PORT

-329

groupにドメイン修飾をしてサービスを要求しましたが,ドメイン代表スケジュールサービスのポート番号が見つかりません。

システム共通定義のdomain_masters_portオペランドの設定,および/etc/servicesのドメイン代表スケジュールサービスのポート番号の設定を見直してください。

DCRPCER_SERVER_BUSY

-356

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

サービス要求先SPPのユーザサービス定義,またはユーザサービスデフォルト定義のmax_socket_msgオペランド,max_socket_msglenオペランドの設定を見直してください。

DCRPCER_TESTMODE

-366

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

UAPのテストモードの設定を見直してください。

DCRPCER_NOT_TRN_EXTEND

-367

トランザクション属性の連鎖RPCを実行したあとで,flagsにDCRPC_TPNOTRANを設定し,dc_rpc_call関数でサービスを要求しています。

DCRPCER_SECCHK

-370

サービス要求先SPPは,セキュリティ機能で保護されています。

dc_rpc_call関数を実行したサービス要求元UAPには,サービス要求先SPPへのアクセス権限がありません。サービス要求先SPPのアクセス権限を見直してください。

DCRPCER_TRNCHK_EXTEND

-372

サービス要求先SPPのOpenTP1で,同時に起動できるトランザクションブランチの数を超えました。そのため,トランザクションブランチを開始できません。

トランザクションサービス定義のtrn_tran_process_countオペランドの設定を見直してください。

サービス要求元UAPが,一つのトランザクションブランチから開始できる子トランザクションブランチの最大数を超えました。そのため,トランザクションブランチを開始できません。

トランザクションサービス定義のtrn_max_subordinate_countオペランドの設定を見直してください。

トランザクション内のドメイン修飾をしたサービス要求で,flagsにDCRPC_TPNOTRANを設定していません。

サービス要求先SPPで,リソースマネジャ(RM)にエラーが発生しました。そのため,トランザクションブランチを開始できません。

リソースマネジャ(RM)のエラー要因を解決したあと,再度実行してください。

TP1/LiNKの「システム環境設定」ウィンドウの「トランザクション機能」が[あり]に設定されていません。

TP1/LiNKの「システム環境設定」の「トランザクション機能」の設定を見直してください。

DCRPCER_SERVICE_TERMINATED

-378

サービス要求先SPPが,サービス関数の実行中に異常終了しました。

サービス要求先SPPのサービス関数処理を見直してください。このリターン値が返るのは,ユーザサービス定義のrpc_extend_functionオペランドに"00000001"を指定したサービス要求元UAPの場合だけです。rpc_extend_functionオペランドに"00000000"を指定,またはオペランドを省略した場合は,このリターン値ではなく,DCRPCER_TIMED_OUT,またはDCRPCER_SERVICE_NOT_UPが返ります。

注※

rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

(1)dc_rpc_call関数の引数について

dc_rpc_call関数の引数について説明します。

サーバUAPに渡す値

サービスを要求するときは,サービス関数から返ってくる応答の領域(out)を確保しておきます。クライアントUAPでは,dc_rpc_call関数に次の値を設定しておきます。

  • 入力パラメタ(in)

  • 入力パラメタ長(in_len)

  • 応答の長さ(out_len)

    入力パラメタ,入力パラメタ長,応答の長さは,クライアントUAPのdc_rpc_call関数で設定した値が,そのままサービス関数に渡されます。文字コードや数字の表記形式を変えたい場合は,クライアントUAP,または要求されたサービス関数の処理で変換してください。応答を返さないサービス関数のサービスを要求するときは,応答の長さを設定しても無視されます。

    入力パラメタ長と応答の長さの最大値は,それぞれヘッダファイルdcrpc.hのDCRPC_MAX_MESSAGE_SIZEで宣言しています。最大値を確認する場合は,dcrpc.hの内容を参照してください。

    注※

    rpc_max_message_sizeオペランドを使用した場合,DCRPC_MAX_MESSAGE_SIZEの値(1メガバイト)ではなく,rpc_max_message_sizeオペランドに指定した値になります。

サーバUAPから戻ってくる値

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

  • サービス関数の応答(out)

  • サービス関数の応答の長さ(out_len)

out_len はサービス関数から実際に返ってきた応答の長さです。outとout_lenを参照できる場合を次に示します。

  • 同期応答型RPC,連鎖RPCの場合

    dc_rpc_call関数がリターンしたあと。

  • 非同期応答型RPCの場合

    dc_rpc_poll_any_replies関数が該当する応答を受け取ってリターンしたあと。out_lenは参照できません。

  • 非応答型RPCの場合

    outとout_lenは参照できません。

dc_rpc_call関数,またはdc_rpc_poll_any_replies関数がエラーリターンした場合には,outとout_lenは参照できません。

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

flagsに設定する値

flagsに設定した値とdc_rpc_call関数の実行結果について説明します。

  • 同期応答型RPC(flagsにDCNOFLAGSを設定)

    dc_rpc_call関数は,応答が返るか,通信先でエラーが起こるまでリターンしません。

  • 非同期応答型RPC(flagsにDCRPC_NOWAITを設定)

    dc_rpc_call関数は,すぐにリターンします。ただし,応答を参照できるのは,dc_rpc_poll_any_replies関数で非同期に応答を受信したあとです。応答(out)の領域は,次に示す方法で非同期応答型RPCを終了するまで,解放しないでください。

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

    • dc_rpc_discard_further_replies関数で応答の受信を拒否

    • トランザクションの処理からサービスを要求した場合は,コミット,またはロールバックした

    トランザクションの処理で非同期応答型RPCを使う場合,同期点処理(コミット,またはロールバック)前にdc_rpc_poll_any_replies関数で応答を受け取ってください。同期点処理後には,dc_rpc_poll_any_replies関数で応答は受信できません。dc_rpc_poll_any_replies関数が受信する応答を特定する場合は,dc_rpc_call関数がリターンしたときに返された正の整数(記述子)を,dc_rpc_poll_any_replies関数の引数に設定します。受信する応答を特定する場合は,dc_rpc_call関数のリターン値を保持しておいてください。

    なお,非トランザクションの処理で,同期点処理後に応答を受け取りたい場合は,システムサービス定義のrpc_extend_functionオペランドで該当するオプションを指定する必要があります。

    rpc_extend_functionについては,マニュアル「OpenTP1 システム定義」を参照してください。

  • 非応答型RPC(flagsにDCRPC_NOREPLYを設定)

    dc_rpc_call関数は,サービス関数の処理が終わるのを待たないで,すぐにリターンします。サービス関数は応答を返さないサービスと見なされます。そのため,サービス関数が実行されたかどうかは,サービスを要求したUAPからはわかりません。DCRPC_NOREPLYを設定した場合は,応答(out)と応答の長さ(out_len)の値は参照できません。

  • 連鎖RPC(flagsにDCRPC_CHAINEDを設定)

    dc_rpc_call関数は,応答が返るか,通信先でエラーが起こるまでリターンしません。連鎖RPCで同じサービスグループに属するサービスを複数回要求する場合は,最初の要求時と同じプロセスで実行できます。

    連鎖RPCを使う場合には,次に示す制限があります。

    1. 2回目以降のdc_rpc_call関数では,ユーザサーバおよびサービスの閉塞を検出できません。

    2. 2回目以降のdc_rpc_call関数でサービス関数の処理で異常が起こった場合には,ユーザサーバ全体が閉塞します。サービス単位では閉塞しません。

(2)dc_rpc_call関数がエラーになる場合

dc_rpc_call関数のエラーリターンする理由について説明します。

サーバUAPがあるノードのOpenTP1が稼働していない場合

サービスを要求されるOpenTP1が稼働していない場合は,dc_rpc_call関数は次に示すリターン値のどれかでエラーリターンします。

  • DCRPCER_NET_DOWN

  • DCRPCER_SERVICE_NOT_UP

  • DCRPCER_OLTF_NOT_UP

  • DCRPCER_OLTF_INITIALIZING

サーバUAPが稼働していない場合

サーバUAPがマルチサーバの場合,異常終了中,または部分回復処理中であっても,サービス要求はOpenTP1で新しく起動されたプロセスで実行されます。ただし,次に示す場合は,dc_rpc_call関数はエラーリターンします。

  1. 閉塞しているSPPへはサービスを要求できません。サービスグループが閉塞されている場合は,DCRPCER_SERVICE_CLOSED でエラーリターンします。

  2. ユーザサーバの停止コマンド(dcsvstopコマンド)またはOpenTP1の停止コマンド(dcstopコマンド)で,SPPが終了処理中または終了している場合は,次に示すどれかのステータスコードでエラーリターンします。

    • DCRPCER_SERVICE_TERMINATING

    • DCRPCER_SERVICE_CLOSED

    • DCRPCER_NO_SUCH_SERVICE_GROUP

    これらのうち,どのリターン値が返るかは,dc_rpc_call関数を呼び出したタイミングで決まります。

  3. OpenTP1が開始処理中の場合は,DCRPCER_OLTF_INITIALIZINGでエラーリターンします。この場合は,サーバUAPまたはOpenTP1が起動完了したあとに正常にサービスを要求できることがあります。OpenTP1は,メッセージID KFCA01809-Iのメッセージログが出力されると起動を完了するので,このメッセージが表示されてから再びサービスを要求してください。

ノード間負荷バランス機能およびノード間負荷バランス拡張機能の環境でサービスを要求した場合

ノード間負荷バランス機能およびノード間負荷バランス拡張機能の環境では,該当するサービスのスケジュールが閉塞していると,OpenTP1が自動的にほかのノードにサービス要求を転送します。ただし,次に示す条件の場合dc_rpc_call関数はDCRPCER_TRNCHKでエラーリターンします。

  1. トランザクション処理の場合,転送しようとした先のノードにあるサービスのトランザクション属性が,閉塞していたサービスと一致していないとき。

  2. 転送しようとした先のノードにあるOpenTP1のバージョンが,サービスを要求したOpenTP1のノードのバージョンよりも低いとき。

これらのエラーリターンが起こった場合は,次に示す処置をしてください。

  1. ノード間負荷バランス機能およびノード間負荷バランス拡張機能を構成する複数のSPPのトランザクション属性を一致させてください。

  2. ノード間負荷バランス機能およびノード間負荷バランス拡張機能を構成する複数のOpenTP1のバージョンを一致させてください。

ソケット受信型サーバへサービスを要求する場合

ソケット受信型サーバでは,ユーザサービス定義のmax_socket_msgオペランドとmax_socket_msglenオペランドの指定で,データの輻輳制御をしています。そのため,定義した値を超えた場合,サービス要求を受信できない場合があります。このときdc_rpc_call関数は,DCRPCER_SERVER_BUSYでエラーリターンします。この値が返った場合は,クライアントUAPはしばらく時間をおいてから再実行すれば,サービスを要求できることがあります。

連鎖RPCを使った場合

トランザクションとして処理している連鎖RPCを使っているUAPから,同じサーバUAPへトランザクションでないdc_rpc_call関数を呼び出すと,DCRPCER_NOT_TRN_EXTENDでエラーリターンします。

オンラインテスタを使っている場合

オンラインテスタを使っている場合に,テストモードのUAPとテストモードでないUAP間でdc_rpc_call関数を呼び出すと,DCRPCER_TESTMODE でエラーリターンします。

セキュリティ機能を使っている場合

dc_rpc_call関数を呼び出したときに,目的のサービスがセキュリティ機能で保護されていて,dc_rpc_call関数を呼び出したクライアントUAPにSPPへのアクセス権がない場合は,DCRPCER_SECCHKでエラーリターンします。

(3)dc_rpc_call関数がエラーになるタイミング

サービスを要求されたSPPが異常終了した場合,クライアントUAPでエラーが返るタイミングについて説明します。

クライアントUAPの時間監視でエラーになる場合

次に示す場合には,クライアントUAPのユーザサービス定義のwatch_timeオペランドに指定した時間が経過したあとで,DCRPCER_TIMED_OUTでエラーリターンします。

  • SPPがあるノードのOpenTP1全体が異常終了した場合

  • サービス要求のデータがサーバUAPに届く前,またはサーバUAPの処理が完了してからクライアントUAPに結果が届く前に障害が起こった場合

(4)dc_rpc_call関数がエラーになったときに再実行する指定

開始処理中,または系切り替え中などでサービス要求先のOpenTP1が起動していない場合でも,dc_rpc_call関数をエラーとしないで,OpenTP1で要求先検索,およびサービス要求送信を再実行させられます。

要求先検索,およびサービス要求送信を再実行させる場合は,システム共通定義のrpc_retryオペランドにYを指定してください。要求先検索とサービス要求送信の再実行回数,および再実行間隔は,システム共通定義のrpc_retry_countオペランドとrpc_retry_intervalオペランドで指定します。システム共通定義で指定した再実行回数を超えた場合は,dc_rpc_call関数は次に示すどれかのステータスコードでエラーリターンします。

(5)サービス要求に優先度を付ける場合

サービス要求のスケジュールプライオリティは,dc_rpc_call関数を呼び出す直前に,dc_rpc_set_service_prio関数を呼び出して設定します。プライオリティを設定しない場合は,スケジュールサービスの省略時の解釈で,サービス要求の優先度が決まります。

(6)リターン値DCRPCER_NO_SUCH_SERVICE_GROUPとDCRPCER_NET_DOWNの違い

上記のリターン値は,該当するサービスグループ名のユーザサーバが見つからなかった場合にリターンされます。

(7)リターン値 DCRPCER_SERVICE_TERMINATED をリターンさせる指定

サービスを要求されたSPPが,処理を完了する前に異常終了したことをDCRPCER_TIMED_OUTまたはDCRPCER_SERVICE_NOT_UP以外のリターン値で判別したい場合には,ユーザサービス定義のrpc_extend_functionオペランドに"00000001"を指定します。この指定をすると,上記のエラー時にDCRPCER_SERVICE_TERMINATEDがリターンされるようになります。rpc_extend_functionオペランドに"00000000"を指定するか,またはオペランドを省略した場合は,DCRPCER_SERVICE_TERMINATED は返らないで,DCRPCER_TIMED_OUT またはDCRPCER_SERVICE_NOT_UPがリターンされます。

(8)エラーリターン値と同期点処理の関係

dc_rpc_call関数のリターン値と同期点処理(コミット,ロールバック)の関係について説明します。ここで説明する内容は,サービス要求がトランザクション処理になる場合に該当します。トランザクションでないサービス要求(flagsにDCRPC_TPNOTRANを設定した場合も含む)には該当しません。

dc_rpc_call関数がエラーリターンしてもコミットとなる場合

サービスを要求されたサービス関数の異常終了や,ノードの障害,ネットワーク障害の場合でも,DCRPCER_TIMED_OUTがリターンすることがあります。クライアントUAPがトランザクション処理でない場合は,DCRPCER_TIMED_OUTが返っても,要求したサービスがあるサービス関数は正常に終了していて,データベースへの更新などが実行されているときもあります。

ロールバック処理が必要なエラーリターン値

トランザクション処理から呼び出したdc_rpc_call関数がエラーリターンした場合,リターン値によっては,必ずトランザクションがロールバック(サーバUAPがrollback_only状態)になります。この場合,コミットの関数,またはロールバックの関数のどちらを使っても,必ずロールバックになります。必ずロールバックになるdc_rpc_call関数のリターン値を次に示します。

  • DCRPCER_INVALID_REPLY

  • DCRPCER_NO_BUFS_AT_SERVER

  • DCRPCER_NO_SUCH_SERVICE

  • DCRPCER_REPLY_TOO_BIG_RB

(9)サービスを要求するときの注意

  1. dc_rpc_call関数に設定するサービスグループ名およびサービス名は,サーバUAPの環境設定で指定しておいてください。間違ったサービスグループ名またはサービス名をdc_rpc_call関数に設定してサービスを要求すると,DCRPCER_NO_SUCH_SERVICE_GROUPまたはDCRPCER_NO_SUCH_SERVICE でエラーリターンします。

    応答を返さないサービス関数の場合は, DCRPCER_NO_SUCH_SERVICE ではリターンしません。

  2. サーバUAPは,クライアントUAPとは別のプロセスで実行します。そのため,通常の関数の呼び出しや手続き呼び出しとは,次の点が異なります。

    • OSがクライアントUAPのプロセスに与えている属性は,サーバUAPへは引き継がれません(例えば,環境変数,スケジュールの優先順位(nice値)など)。

    • クライアントUAPのノードで設定したOpenTP1の環境設定は,サーバUAPのOpenTP1へは引き継がれません(例えば,トランザクション属性の指定有無,トランザクションブランチの限界経過時間,スケジュールの優先順位など)。

  3. 入力パラメタ(in)およびサービス関数の応答(out)に,同じバッファ領域を設定しないでください。

  4. flagsにDCRPC_NOREPLYを設定した場合には,次に示すリターン値は返りません。

    • 起こらないエラー

      DCRPCER_REPLY_TOO_BIG

      DCRPCER_INVALID_REPLY

    • 起こっても検出できないエラー

      DCRPCER_NO_SUCH_SERVICE

      DCRPCER_SERVICE_TERMINATING

      DCRPCER_SYSERR_AT_SERVER

      DCRPCER_NO_BUFS_AT_SERVER

      DCRPCER_SECCHK

    また,エラー発生時にOpenTP1にメッセージを出力することもありません。エラーを検出しなければならない場合,flagsにDCNOFLAGSを設定する(同期応答型RPC)ことを検討してください。

  5. トランザクションの処理からdc_rpc_call関数でサービスグループを呼び出すと,トランザクションが決着するまで一つのSPPを占有します。同じトランザクションの処理から,dc_rpc_call関数で同じサービスを複数回使う場合は,次に示すようにしてください。

    • 使う回数に応じて,ユーザサービス定義のbalance_countオペランドおよびparallel_countオペランドの指定値を見積もり直す。

    • プロセスが増えないように,連鎖RPCでサービスを要求する。

    balance_countオペランドおよびparallel_countオペランドの指定値に誤りがあると,トランザクションが異常終了したり,デッドロックが起こったりする場合があります。

  6. 非同期応答型RPCを使う場合には,dc_rpc_poll_any_replies関数ですべての非同期の応答を受信するか,dc_rpc_discard_further_replies関数で非同期の応答を拒否するまで,サーバUAP(SPP)を占有する場合があります。これは,トランザクションの処理の場合にもトランザクションの処理でない場合にも起こります。非同期応答型RPCを使う場合には,使う回数に応じて,常駐プロセス数の指定を増やしておいてください。

    非同期応答型RPCは,SPPを占有すること以外にも多くの資源を必要とします。UAPの処理効率が下がったり,必要ないSPPが開始されたりすることを防ぐため,非同期応答型RPCのdc_rpc_call関数を使ったあとには,確実に応答を受信するか,受信を拒否するかしてください。

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

  8. 非同期応答型RPCでサービス要求したサーバUAP(SPP)は,非同期応答型RPCを実行したプロセスがdc_rpc_poll_any_replies関数を発行したかどうかにかかわらず,サービス関数実行後にすぐに応答を送信します。dc_rpc_poll_any_replies関数を発行しないで,複数回の非同期応答型RPCを大量に実行すると,SPPから送信される応答がTCP/IPのバッファにたまり,SPPの応答送信処理が失敗する場合があります。SPPで応答送信処理が失敗すると,非同期応答型RPC発行元では,dc_rpc_poll_any_replies関数を発行しても,SPPから応答を受信することはできません。

  9. トランザクション属性の非同期応答型RPC,または非応答型RPCを大量に実行すると,SPPから送信されるトランザクションについてのメッセージを受信できなくなり,トランザクションがロールバックすることがあります。

(10)ドメイン修飾をしてサービスを要求する場合

ドメイン修飾したサービスグループ名を設定すると,DNSのドメイン内にあるOpenTP1のサービスを要求できます。ドメイン修飾をしたサービスグループ名は,サービスグループ名の後ろに,@DNSのドメイン名を付けて設定します。

ドメイン修飾をしてサービスを要求するときの注意

  1. ドメイン修飾をしてサービスを要求する場合は,dc_rpc_call関数のflagsにDCRPC_DOMAINを設定します。DCRPC_DOMAINを設定しないでドメイン修飾をしたサービスグループ名を設定すると,dc_rpc_call関数は DCRPCER_NO_SUCH_SERVICE_GROUPでエラーリターンします。

  2. ドメイン修飾をしたRPCの場合,dc_rpc_call関数を呼び出したプロセスがトランザクションの処理でも,トランザクションを拡張できません。そのため,トランザクションの処理からドメイン修飾をしてサービスを要求する場合は,flagsにDCRPC_TPNOTRANを指定して,トランザクションを拡張しないようにしてください。なお,ドメイン名に自ドメインを設定した場合でも,トランザクションを拡張できません。

  3. ドメイン修飾をしたRPCでは,キュー受信型サーバにだけサービスを要求できます。ソケット受信型サーバへは,ドメイン修飾をしたサービス要求はできません。

  4. ドメイン修飾をしたサービス要求では,namdomainsetupコマンドで登録したホストで起動されるドメイン代表スケジュールサービスへサービス要求を送信します。ドメイン代表スケジュールサービスのポート番号は,/etc/services から取得します。サービス要求の送信で障害が起こった場合は,namdomainsetupコマンドで複数のホスト名を登録していれば,順次送信を試みます。ドメイン修飾をしたRPCが正常に終了しても,ドメイン代表スケジュールサービスへの送信で障害が起こっている場合もあります。

ドメイン修飾をしたサービス要求をする前の準備

ドメイン修飾をしたRPCでは,次に示す環境設定をしてください。

  1. DNSのドメインデータファイルへ,ドメイン代表スケジュールサービスを起動するホスト名を登録します。登録するときは,namdomainsetupコマンドを使います。

  2. ドメイン修飾をしたサービス要求をするOpenTP1を起動するホストの/etc/servicesへ,ドメイン代表スケジュールサービスのポート番号を設定します。ポート番号は,次の形式で記述してください。

    OpenTP1scd ポート番号/tcp
  3. ドメイン代表スケジュールサービスを起動するOpenTP1のスケジュールサービス定義のscd_portオペランドに,ドメイン代表スケジュールサービスのウェルノウンポートを指定します。

注意事項

システム共通定義のall_nodeオペランドで指定したドメイン以外のOpenTP1システムにトランザクショナルRPCを行う場合,自ドメインおよび他ドメイン内のすべてのOpenTP1システムのノード識別子(システム共通定義のnode_idオペランド)は一意にする必要があります。また,すべてのOpenTP1システムは,バージョン03-02以降にする必要があります。これらの条件を満たしていないと,トランザクションが正しく回復できなくなる場合があります。