あわわ

リモートプロシージャコールの通信要件について、
一部漏れがあって、慌てて修正。
いや通信部分の共通モジュールを一部いじれば良いだけなんだけど。


具体的には、JavaRMI使うとき、
Naming.lookupメソッドでRemoteオブジェクト呼び出せても、
実際にそっからメソッド実行して正常に通信できるかって保証できないんだよね。
で、複数のリモートサーバがあった場合に、使えるサーバ/サービスをチェックしたい、と。


そんなわけで、Naming.lookup使って、RemoteオブジェクトのStub取得、
RemoteStub.getRefを実行して、リモートへの参照取得であるRemoteRef、
RemoteRefのinvokeを実行して適当なメソッドを呼び出す、と。
このとき、実際には有り得ない、toString()やhashCode()なんかを呼び出すことがポイント。
invokeの引数でメソッド、引数、及びメソッドのハッシュ値を取るんだけど、
ハッシュ値を-1とかにして、且つメソッドもRemoteで実行できないtoString()とかにしておけば、
呼出時点で失敗して、実際のサービスには副作用は発生しない、と言う仕掛け。


リモート側のダウン等で実際に接続できなかったら、java.rmi.ConnectException
接続できて有り得ないメソッドに対してのRPC実行できたら、java.rmi.RemoteException
もしrmiregistryに接続できなかったら、Naming.lookupの時点で落ちるし、
この辺の例外の出方で色々制御できる、と。


この辺使えば、rmiサービスの死活判定に使えそうな感じなんで、
運用チームに提案してみるかな。