忘れそうなので、メモ。
UnicastRemoteObject#exportObjectの動きはこんな感じ。
- sun.rmi.server.UnicastRemoteRefを作る。
- UnicastRemoteRefのコンストラクタはsun.rmi.transport.LiveRefを作る。
- LiveRefのコンストラクタはTCPEndpoint#getLocalEndpointを呼んで、sun.rmi.transport.tcp.TCPEndpointとsun.rmi.transport.tcp.TCPTransportが作られる。
- UnicastRemoteRef#exportObjectを呼ぶ。
- UnicastRemoteRef#exportObjectがリモートオブジェクトのもろもろの情報を含んだsun.rmi.transport.Targetを作って、LiveRef#exportObjectに渡す。
- LiveRef#exportObjectはTCPEndpoint#exportObjectにTargetを渡す。
- TCPEndpoint#exportObjectはTCPTransport#exportObjectにTargetを渡す。
- TCPTransport#exportObjectはTCPTransport#listenを呼んで、ソケット待ちのスレッドがなければ作り、sun.rmi.transport.Transport#exportObjectにTargetを渡す。
- Transport#exportObjecがTargetをsun.rmi.transport.ObjectTableに格納する。
クライアントからメソッド呼び出しがあった場合のシーケンスも読んだのですが、めんどうなので略。
Target#getObjectEndpoint()がObjectTableのキーの「生成」メソッドだったりとか、歴史的に気持ち悪いところが残っているコードでした。
0 件のコメント:
コメントを投稿