2.1.3 リモートプロシジャコールの形態
RPCには次の形態があります。RPCの形態は,クライアントUAPのdc_rpc_call関数にフラグで設定します。RPCの形態を次の図に示します。
|
-
サーバUAPの処理結果をクライアントUAPに返すRPCです。応答型RPCには,dc_rpc_call関数を呼び出してから,サーバUAPの処理結果が返ってくるのを待つ同期応答型RPCと,処理結果を非同期に受信する非同期応答型RPCがあります。
-
サーバUAPの処理結果をクライアントUAPに返さないRPCです。dc_rpc_call関数の呼び出し後にリターンして,処理を続けます。クライアントUAPではサーバUAPの処理結果を受信できません。
トランザクション処理でRPCを使った場合の,同期点とRPCとの関係については,「2.3.4 リモートプロシジャコールの形態と同期点の関係」を参照してください。
- 〈この項の構成〉
(1) 同期応答型RPC
dc_rpc_call関数を呼び出してから,サーバUAPの処理結果が返ってくるのを待つ形態です。同期応答型のRPCを使うときは,dc_rpc_call関数のflagsにDCNOFLAGS(またはDCRPC_CHAINED)を設定します。
(a) 同期応答型RPCの時間監視
dc_rpc_call関数を呼び出してから,応答が返るまでの時間は,次に示す値で監視されています。
-
TP1/Server Baseの場合:
ユーザサービス定義のwatch_timeオペランドに指定した値
-
TP1/LiNKの場合:
180秒
サーバUAPの処理に時間が掛かって,指定した監視時間を過ぎてしまった場合は,dc_rpc_call関数はエラーリターンします。
このときサーバUAPでは,クライアントUAPの応答待ち時間を認識しているため,クライアントUAPがタイムアウトしたあとにスケジューリングされたサービスは実行しないで廃棄し,実行中のサービスについては応答を返さずに処理を打ち切ります。サーバUAPで,クライアントUAPのタイムアウトを検知したことによって,サービス要求を廃棄したことをメッセージ表示したい場合は,サーバUAPのユーザサービス定義のrpc_extend_functionオペランドに00000008を指定してください。
サーバUAPが異常終了すると,dc_rpc_call関数はすぐにエラーリターンします。ただし,次に示す場合には,指定した監視時間が過ぎてからエラーリターンします。
-
サーバUAPがあるノードのOpenTP1全体が異常終了した場合
-
サービス要求のデータがサーバUAPに届く前,またはサーバUAPの処理が完了してからクライアントUAPに結果が届く前に障害が起こった場合
同期応答型RPCを次の図に示します。
|
(2) 非同期応答型RPC
dc_rpc_call関数を呼び出してから,サーバUAPの処理結果が返ってくるのを待たないで処理を続ける形態です。非同期応答型RPCを複数回呼び出すことで,RPCを並行処理できます。
非同期応答型RPCのdc_rpc_call関数(flagsにDCRPC_NOWAITを設定)は,サービス要求後にリターンします。UAPではリターン後に処理を続けます。
非同期応答型RPCは,サービス要求がサーバに受け付けられたことを確認しないでリターンします。一つのクライアントUAPから同じサービスグループに複数の非同期応答型RPCでサービスを要求した場合,サーバ側でこの要求順どおりにサービスを受け付けるとは限りません。
(a) 非同期応答型RPCの応答の受信
サーバUAPの処理結果は,dc_rpc_poll_any_replies関数【CBLDCRPC('POLLANYR')】を呼び出して,非同期に受信します。処理結果は,dc_rpc_poll_any_replies関数を使わないと受信できません。
非同期応答型RPCの応答を受信するときは,どの応答を受信するか特定できます。特定する場合は,非同期応答型RPCのサービス要求をしたdc_rpc_call関数がリターンしたときに返された正の整数(記述子)を,dc_rpc_poll_any_replies関数の引数に設定します。この設定をすると,記述子に該当する非同期応答型RPCの応答を受信します。
受信する応答を特定しない場合は,応答が戻ってきた順に受信します。応答を特定しない場合,dc_rpc_poll_any_replies関数が正常に終了すると,受信した非同期応答の記述子と同じ値をリターンします。
非同期応答型RPCのdc_rpc_call関数を呼び出した数よりも多くdc_rpc_poll_any_replies関数を呼び出した場合は,エラーリターンします。
サービス要求でエラーが起こった場合は,dc_rpc_poll_any_replies関数にエラーリターンします。
flagsにDCRPC_NOWAITを設定したdc_rpc_call関数を呼び出し,dc_rpc_call関数に対する応答を受信する前にトランザクション同期点処理をする関数を呼び出すと,そのあとに呼び出すdc_rpc_poll_any_replies関数は,DCRPCER_ALL_RECEIVEDでエラーリターンし,応答を受信できません。非同期応答型RPCの場合,トランザクション内で実行したかどうかに関係なく,該当するプロセスでのトランザクション同期点処理の実行前に応答を受信する必要があります。
(b) 非同期応答型RPCの時間監視
非同期応答型RPCの場合,ユーザサービス定義のwatch_timeに指定した値は参照されません。dc_rpc_poll_any_replies関数を呼び出してから,応答が返るまでの最大応答待ち時間は,引数timeoutに設定します。
サーバUAPの処理に時間が掛かって,設定した監視時間を過ぎてしまった場合は,dc_rpc_poll_any_replies関数はエラーリターンします。
サーバUAPが異常終了すると,dc_rpc_poll_any_replies関数はすぐにエラーリターンします。ただし,次に示す場合には,設定した監視時間が過ぎてからエラーリターンします。
-
サーバUAPがあるノードのOpenTP1全体が異常終了した場合
-
サービス要求のデータがサーバUAPに届く前,またはサーバUAPの処理が完了してからクライアントUAPに結果が届く前に障害が起こった場合
処理結果の非同期受信を次の図に示します。
|
(c) 処理結果の受信を拒否
非同期応答型RPCで,まだ返ってきていない応答をこれ以上受信しない場合は,処理結果の受信を拒否する関数(dc_rpc_discard_further_replies関数【CBLDCRPC('DISCARDF')】)を呼び出します。この関数を呼び出したあとに返ってきた応答は,受信されないで捨てられます。非同期応答型RPCの結果を受信しない場合は,必ず処理結果の受信を拒否する関数を呼び出してください。呼び出さないと,ほかの非同期応答型RPCのdc_rpc_poll_any_replies関数が,不要な応答を受信してしまうことがあります。
dc_rpc_discard_further_replies関数を使うのは次のような場合です。
-
応答待ち時間切れになったあと,次の処理に移る前に,結果を保持しておくバッファをすぐに解放したい場合
-
非同期応答型RPCを複数回呼び出して,そのうち最初の応答だけ必要な場合
また,非同期応答型RPCで,まだ返ってきていない応答の中で特定の応答だけを受信しない場合は,特定の処理結果の受信を拒否する関数(dc_rpc_discard_specific_reply関数【CBLDCRPC('DISCARDS' )】)を呼び出します。この関数を呼び出したあとに返ってきた応答の中で,指定された記述子と同じ記述子を持つ応答は受信されないで捨てられます。
処理結果の受信の拒否を次の図に示します。
|
(d) 同期点との関係
非同期応答型RPCをトランザクション内で呼び出した場合,同期点処理したあとは非同期に応答を受信できません。同期点と非同期応答型RPCについては,「2.3.4 リモートプロシジャコールの形態と同期点の関係」を参照してください。
(3) 非応答型RPC
サーバUAPの処理結果をクライアントUAPに返さないRPCです。クライアントUAPではサーバUAPの処理結果を受信できません。
非応答型RPCの時間監視はしません。
非応答型RPCのdc_rpc_call関数(flagsにDCRPC_NOREPLYを設定)は,サービス要求後にリターンします。UAPではリターン後は処理を続けます。サーバUAPの処理結果は受信できません。
非応答型RPCは,サービス要求がサーバに受け付けられたことを確認しないでリターンします。このことによって,通信障害などでサービス要求が消失しても,クライアントUAPで認識することはできません。また,一つのクライアントUAPから同じサービスグループに複数の非応答型RPCでサービスを要求した場合,サーバ側でこの要求順どおりにサービスを受け付けるとは限りません。
非応答型RPCを次の図に示します。
|