Hitachi

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


dc_rpc_poll_any_replies

〈このページの構成〉

名称

処理結果の非同期受信

形式

ANSI C ,C++の形式

#include <dcrpc.h>
int  dc_rpc_poll_any_replies(int des,DCLONG timeout,
                             DCLONG flags)

K&R版 C の形式

#include <dcrpc.h>
int  dc_rpc_poll_any_replies(des,timeout,flags)
int       des;
DCLONG    timeout;
DCLONG    flags;

機能

非同期応答型RPC(dc_rpc_call関数のflagsにDCRPC_NOWAITを設定)でサービス要求した結果を受信します。

受信する非同期応答を特定する場合は,flagsにDCRPC_SPECIFIC_MSGを設定します。このフラグを設定した場合は,desに設定した記述子をリターンした非同期応答型RPCの応答を受信します。

受信する非同期応答を特定しない場合は,flagsにDCNOFLAGSを設定します。このとき,desに設定した値は無視されます。flagsにDCNOFLAGSを設定したdc_rpc_poll_any_replies関数が正常に終了すると,受信した非同期応答の記述子と同じ値をリターンします。

dc_rpc_poll_any_replies関数は,次のどちらかの場合にリターンします。

dc_rpc_poll_any_replies関数が正常に終了すると,非同期応答型RPCを使ったdc_rpc_call関数に設定した応答を格納する領域に,受信した応答が設定されます。

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

(1)dc_rpc_poll_any_replies関数の引数 timeout について

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

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

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

(5)dc_rpc_poll_any_replies関数で応答が受け取れない場合

(6)dc_rpc_poll_any_replies関数を使うときの注意

UAPで値を設定する引数

●des

非同期応答型RPCのdc_rpc_call関数(flagsにDCRPC_NOWAITを設定)が正常に終了したときに返された,記述子を設定します。flagsにDCNOFLAGSを設定した場合は,ここに設定した値は無視されます。

●timeout

非同期応答型RPCのdc_rpc_call関数の結果が返ってくるまでの待ち時間を,秒単位またはミリ秒単位で設定します。指定できる値の範囲は,-1からDCLONG型で表せる最大の数までです。

dc_rpc_poll_any_replies関数で非同期応答を受信する場合は,UAPに設定した応答待ち時間を参照しません。

0を設定した場合は,flagsにDCNOFLAGS,またはDCRPC_SPECIFIC_MSGを設定したとき,応答が返っていないと DCRPCER_TIMED_OUTで すぐにエラーリターンします。flagsにDCRPC_WAIT_MILLISECを設定したときは50ミリ秒として処理します。

-1を設定した場合は,応答が返るまで待ち続けます。

●flags

次に示す形式で設定します。

{DCNOFLAGS|DCRPC_SPECIFIC_MSG}〔|DCRPC_WAIT_MILLISEC〕
DCNOFLAGS

このdc_rpc_poll_any_replies関数で受信する非同期の応答を特定しません。

DCRPC_SPECIFIC_MSG

desに設定した記述子をリターンした,非同期応答型RPCの応答を受信します。

DCRPC_WAIT_MILLISEC

timeoutで設定した待ち時間の単位をミリ秒にします。

リターン値

リターン値

リターン値(数値)

意味

正の整数

受信した非同期応答の記述子を示します。正の整数は,flagsにDCNOFLAGSを設定したdc_rpc_poll_any_replies関数が正常に終了した場合に返されます。

DC_OK

0

正常に終了しました。DC_OKは,flagsにDCRPC_SPECIFIC_MSGを設定したdc_rpc_poll_any_replies関数が正常に終了した場合に返されます。

DCRPCER_INVALID_ARGS

-301

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

DCRPCER_PROTO

-302

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

DCRPCER_NO_BUFS

-304

メモリが不足しました。

DCRPCER_NET_DOWN

-306

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

DCRPCER_TIMED_OUT

-307

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

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

DCRPCER_MESSAGE_TOO_BIG

-308

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

DCRPCER_REPLY_TOO_BIG

-309

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

DCRPCER_NO_SUCH_SERVICE_GROUP

-310

dc_rpc_call関数またはdc_gwf_call関数のgroupに設定したサービスグループは,定義されていません。または,groupに設定したサービスグループがサポートしていない機能を使用して,dc_rpc_call関数もしくはdc_gwf_call関数を実行しています。

DCRPCER_NO_SUCH_SERVICE

-311

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

DCRPCER_SERVICE_CLOSED

-312

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

DCRPCER_SERVICE_TERMINATING

-313

dc_rpc_call関数またはdc_gwf_call関数のserviceに設定したサービスは,終了処理中です。

DCRPCER_SERVICE_NOT_UP

-314

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

timeoutに-1を設定した場合に,サービスを要求されたSPPが,処理を完了する前に異常終了しました。

DCRPCER_OLTF_NOT_UP

-315

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

DCRPCER_SYSERR_AT_SERVER

-316

dc_rpc_call関数またはdc_gwf_call関数に設定したサービスで,システムエラーが起こりました。

DCRPCER_NO_BUFS_AT_SERVER

-317

dc_rpc_call関数またはdc_gwf_call関数に設定したサービスで,メモリが不足しました。

DCRPCER_SYSERR

-318

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

DCRPCER_INVALID_REPLY

-319

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

DCRPCER_OLTF_INITIALIZING

-320

サービスを要求されたノードにあるOpenTP1は,開始処理中です。

DCRPCER_ALL_RECEIVED

-321

非同期応答型RPCで要求したサービスの処理結果は,すべて受信しました。

DCRPCER_INVALID_DES

-322

desに設定した記述子は存在しません。このリターン値は,flagsにDCRPC_SPECIFIC_MSGを設定した場合に返されます。

DCRPCER_NO_BUFS_RB

-323

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

DCRPCER_SYSERR_RB

-324

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

DCRPCER_SYSERR_AT_SERVER_RB

-325

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

DCRPCER_REPLY_TOO_BIG_RB

-326

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

DCRPCER_TRNCHK

-327

ノード間負荷バランス機能およびノード間負荷バランス拡張機能の環境で,複数のSPPのトランザクション属性が一致していません。このリターン値は,ノード間負荷バランス機能およびノード間負荷バランス拡張機能を使っているSPPにサービスを要求した場合にだけリターンされます。

DCRPCER_NO_SUCH_DOMAIN

-328

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

DCRPCER_NO_PORT

-329

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

DCRPCER_SERVER_BUSY

-356

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

DCRPCER_TESTMODE

-366

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

DCRPCER_SECCHK

-370

サービスを要求されたSPPは,セキュリティ機能で保護されています。dc_rpc_call関数またはdc_gwf_call関数でサービスを要求したUAPには,SPPへのアクセス権限がありません。

DCRPCER_TRNCHK_EXTEND

-372

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

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

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

DCRPCER_SERVICE_TERMINATED

-378

サービスを要求された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_poll_any_replies関数の引数timeoutについて

非同期受信の監視時間は,応答が返るたびにリセットされます。そのため,受信する非同期応答を特定(flagsにDCRPC_SPECIFIC_MSGを設定)した場合は,timeoutに設定した時間を経過しても,応答を受信できる場合があります。また,timeoutに設定した時間を経過しても,DCRPCER_TIMED_OUTでエラーリターンしない場合もあります。

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

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

サービスを実行するSPPが処理の終わる前に異常終了すると,dc_rpc_poll_any_replies関数は DCRPCER_TIMED_OUTでエラーリターンします。dc_rpc_poll_any_replies関数の引数timeoutに-1を設定している場合は,DCRPCER_SERVICE_NOT_UPでエラーリターンします。

dc_rpc_poll_any_replies関数の時間監視でエラーになる場合

次に示す場合には,dc_rpc_poll_any_replies関数の引数timeoutに設定した時間が経過したあとで,DCRPCER_TIMED_OUTでエラーリターンします。

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

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

(3)リターン値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がリターンされます。

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

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

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

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

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

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

  • DCRPCER_INVALID_REPLY

  • DCRPCER_NO_BUFS_AT_SERVER

  • DCRPCER_NO_SUCH_SERVICE

  • DCRPCER_REPLY_TOO_BIG_RB

(5)dc_rpc_poll_any_replies関数で応答が受け取れない場合

非同期応答型RPCでサービスを要求したUAPが次に示す関数を呼び出すと,dc_rpc_poll_any_replies関数で応答を受け取れません。

  1. dc_rpc_discard_further_replies関数で,非同期応答の受信を拒否した場合

  2. トランザクションの処理の場合,同期点処理の関数でコミット またはロールバックした場合

上記の関数を使ったあとで返ってきた応答は,破棄されます。非同期応答型RPCでは,上記の関数を呼び出す前に,必要な非同期の応答をdc_rpc_poll_any_replies関数ですべて受け取ってください。

(6)dc_rpc_poll_any_replies関数を使うときの注意

  1. dc_rpc_poll_any_replies関数を待ち時間0と設定(引数 timeout に0を設定)して呼び出すと,マルチスレッド環境のスケジューリングの関係で,応答が到着していても受信できない場合があります。そのため,すべての応答を受信するまで,待ち時間に0を設定したdc_rpc_poll_any_replies関数を呼び出すUAPは,無限ループになることがあるので注意してください。

  2. 記述子を特定しないdc_rpc_poll_any_replies関数がエラーリターンした場合,エラーとなった応答の記述子を特定できません。dc_rpc_poll_any_replies関数がエラーリターンしたときに該当する記述子がわかるようにしておきたい場合は,flagsにDCRPC_SPECIFIC_MSGを設定しておいてください。