Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 クライアント使用の手引 TP1/Client/J編


2.2.3 RPCの形態

TP1/Client/Jで実行できるRPCの形態は,同期応答型RPC,非応答型RPC,および連鎖型RPCです。

〈この項の構成〉

(1) 同期応答型RPC

CUPからSPPへ問い合わせメッセージを送信し,応答メッセージを受信する形態です。CUPは,SPPから処理結果が返ってくるまで,次の処理を待ちます。同一サービスを複数回呼び出した場合,サーバプロセスはそのたびにスケジュールされます。

同期応答型RPCの処理の流れを次の図に示します。

図2‒3 同期応答型RPCの処理の流れ

[図データ]

(2) 非応答型RPC

CUPからSPPへ問い合わせメッセージを送信し,応答メッセージを受信しない形態です。CUPは,SPPへ問い合わせメッセージを送信したあと,SPPから処理結果を受け取らないで,すぐに次の処理を実行します。

非応答型RPCでは,何らかの通信障害が発生した場合や呼び出したサービスが誤っていた場合でもエラーを受け取れません。

非応答型RPCの処理の流れを次の図に示します。

図2‒4 非応答型RPCの処理の流れ

[図データ]

(3) 連鎖型RPC

TP1/Client/JのリモートAPI機能を使用したCUPからSPPへ問い合わせメッセージを送信し,問い合わせた応答メッセージを受信する形態です。CUPは,SPPから処理結果が返ってくるまで,次の処理を待ちます。同期応答型RPCとの違いは,サーバプロセスを固定できることです。連鎖型RPCの場合,同一サービスに複数回問い合わせメッセージを送信しても,サーバプロセスは再スケジュールされません。

連鎖型RPCを使用すると,一つのトランザクション処理に必要なユーザプロセスの数が少なくなり,トランザクション処理に掛かる負荷を軽減できます。トランザクションとして連鎖型RPCを使用する場合は,一つのグローバルトランザクションで動作します。

連鎖型RPCの開始

連鎖型RPCとなるサービス要求をする場合は,サービスを要求するrpcCallメソッドのflags引数にDCRPC_CHAINEDを指定してください。この値を指定してサービスを要求すると,SPPは連鎖型RPCであることを認識して,プロセスを確保します。2回目以降のサービス要求のflags引数にもDCRPC_CHAINEDを指定します。

連鎖型RPCの終了

連鎖型RPCは,次のどちらかの方法で終了します。

  • 連鎖型RPCを実行しているサービスグループに対して,flags引数にDCNOFLAGSを指定したrpcCallメソッド(同期応答型RPC)を実行する。

  • 連鎖型RPCを実行しているグローバルトランザクションを同期点処理(コミット,またはロールバック)で完了させる。

注※

同期応答型RPCを実行しないでcloseConnectionメソッド,またはrpcCloseメソッドを呼び出すと,次の状態となります。

  • グローバルトランザクションの範囲外の場合

    サービスを実行していたプロセスは連鎖型RPCタイムアウトになるまで占有されます。

  • グローバルトランザクションの範囲内の場合

    暗黙的にコミットされ,連鎖型RPCを終了します。

連鎖型RPCの時間監視

連鎖型RPCでサービスを要求されるUAPは,CUPに応答を返してから,次のサービス要求が来るまでの間,またはトランザクションの同期点処理が来るまでの時間を監視しています。この監視時間を過ぎても次のサービス要求,または同期点処理要求が来ない場合は,CUPで障害が発生したものと判断して,SPPを異常終了させます。監視時間はユーザサービス定義のwatch_next_chain_timeオペランドで指定します。