2010/03/05

Java RMI周りのコード読み

諸事情でJava RMI周りのコードをちょっと読んでいます。
忘れそうなので、メモ。

UnicastRemoteObject#exportObjectの動きはこんな感じ。

  1. sun.rmi.server.UnicastRemoteRefを作る。

  2. UnicastRemoteRefのコンストラクタはsun.rmi.transport.LiveRefを作る。

  3. LiveRefのコンストラクタはTCPEndpoint#getLocalEndpointを呼んで、sun.rmi.transport.tcp.TCPEndpointとsun.rmi.transport.tcp.TCPTransportが作られる。

  4. UnicastRemoteRef#exportObjectを呼ぶ。

  5. UnicastRemoteRef#exportObjectがリモートオブジェクトのもろもろの情報を含んだsun.rmi.transport.Targetを作って、LiveRef#exportObjectに渡す。

  6. LiveRef#exportObjectはTCPEndpoint#exportObjectにTargetを渡す。

  7. TCPEndpoint#exportObjectはTCPTransport#exportObjectにTargetを渡す。

  8. TCPTransport#exportObjectはTCPTransport#listenを呼んで、ソケット待ちのスレッドがなければ作り、sun.rmi.transport.Transport#exportObjectにTargetを渡す。

  9. Transport#exportObjecがTargetをsun.rmi.transport.ObjectTableに格納する。



クライアントからメソッド呼び出しがあった場合のシーケンスも読んだのですが、めんどうなので略。

Target#getObjectEndpoint()がObjectTableのキーの「生成」メソッドだったりとか、歴史的に気持ち悪いところが残っているコードでした。

0 件のコメント: