15-2 Stubファイルの動的なロード


・ RMIでは VM間を Serializabilityの機構を通じてオブジェクトの転送が 行われることがわかりました。 では分散オブジェクト自体はどのように取り扱われるのでしょうか? 次に この点を調べてみましょう。 一般に分散オブジェクトから構成されるアプリケーションでは 複数のマシンに資源が分割されて管理されます。 分散オブジェクト自身は VM間を転送されるわけではありませんが、 その情報の一部はネットワークを通じてやりとりさる必要があります。
 この仕組みも、やはり具体的なサンプルを通じて見た方が理解しやすいでしょう。 サンプルの分散オブジェクトとして、 簡単な「チャットツール」の中で 各参加者にメッセージを転送する役割を行うサーバーのクラス TalkServerのインターフェイス およびその実装 TalkServerImplを設計してみます。

・ まず公開される機能を記述したインターフェイス TalkServerです。 このインターフェイスによって3個のメソッドの名前が定められます。 新しいメッセージを送り出すための updateMessage()、 参加者(メッセージの受け手)を登録する addMessageReceiver()および 登録を抹消する removeMessageReceiver()です。
 このインターフェイスを実装し、分散オブジェクトとして実現したのが TalkServerImplクラスです。 このクラスは必要最低限の機能を実装したもので、 受け手のリストを Vectorのオブジェクトとして記憶し、 受け手の各オブジェクトに順番にメッセージ更新を通告します。 受け手を表す MessaageReceiverというクラスは、 やはり分散オブジェクトとして実現しますが、その詳細は後の章で解説します。 ここでは単に受け取り手を表していることのみ理解していただければ十分です。 またメッセージを表すクラスして、先ほど説明に利用した Messageクラスを 利用します。
 RMIの分散オブジェクトの開発手順では 上記のソースファイルを Javaコンパイラでコンパイルした後、 さらに RMIのコンパイル作業が必要でした。 それによってさらに2個のバイトコードが自動的に生成されます。 つまり結果として分散オブジェクトの提供側には以下の4個のバイトコードが 存在することになります。 TalkServer.class, TalkServerImpl.class, TalkServerImpl_Stub.class, TalkServerImpl_Skel.class です。 (この他にメッセージとして転送されるオブジェクトの クラスである Message.class も利用できなくてはいけません。 通常は TalkServerImplクラスからアクセスできるように同一のマシンに 資源がおかれることになるでしょう。)
 では分散オブジェクトのサービスを受ける側で必要なものは何でしょうか? サービスを受けるためにはそれが定義された TalkServer.class は必要です。 (また転送されてきたメッセージのオブジェクトを生成するために Message.classが必要であることも先に解説したとおりです。) 以上をまとめると次の表のようになるでしょう。

分散オブジェクト TalkServerの利用のために必要な資源
分散オブジェクトの提供側分散オブジェクトの利用側
TalkServer.class
TalkServerImpl.class
TalkServerImpl_Stub.class
TalkServerImpl_Skel.class
Message.class
TalkServer.class
Message.class

 注意深い読者ならば、1つ疑問を持つかもしれません。TalkServerImpl_Stub.class は利用側で必要な資源のはずです。 (分散オブジェクトの「実体」の「代理のオブジェクト」として機能する。) このクラスのオブジェクトは提供側ではなく 利用側の VMが生成しなくてはなりません。 にもかかわらず Stubクラスの資源は提供側に存在します。 またそうあるべきです。 なぜなら、利用する側には TalkServerを実装したクラスの名前が何であるか、 あらかじめ予測できないからです。 上のサンプルではたまたま TalkServerImplという名前でしたが、 それはネームサーバに問い合わせて サービスを呼び出してみるまで知る手段はありません。 異なる環境で実行された場合には 全く別の TalkServerの実装クラスがサービスを提供している可能性もあります。
 したがって分散オブジェクトを利用する側は、 Stubファイルのデータを特別な方法で手に入れる必要があります。 またこの情報が Serializabilityの機構によって 伝えることはできません。 Stubクラスのオブジェクトは全く未知のクラスの情報を動的に利用できなければ ならないからです。もちろんたまたま指定された資源がローカルで利用できる という場合もあり得ますが、一般的には VMはネットワークを通じて 特定の URLで指定されたクラスのバイトコードを直接ロードすることになります。