16-1 Naming と list()メソッド


・ 分散オブジェクトのサービスを受けるためには、 分散オブジェクトの「名前」を指定しました。この「名前」は "rmi://" で始まる URLの形式になっています。 "rmi://"に続いて「マシン名(もしくはIPアドレス)」と 分散オブジェクトの固有の名前が続きます。区切りは "/" です。 同一のマシン上には同じ名前の分散オブジェクトは存在できません。 これらの名前は、それぞれのマシンの rmiregistryサーバによって管理されています。 Webのサーバによって種々の資源が管理される仕組みと、基本的には同じです。
 しかし、時には相手のサーバの「名前」がわからない場合もあるでしょう。 その場合には、Namingクラスの list()メソッドを利用することが可能です。 このメソッドは指定されたマシンの rmiregistryサーバに問い合わせ、 登録されている分散オブジェクトの名前の一覧を返してくれます。 引数として与える URL形式の文字列は、"rmi://" プラス「マシン名」になることに注意してください。 返される文字列はフルの URLなので、オブジェクト名を得るためには java.util.StringTokenizerを用いると便利でしょう。


String hostName = "wakkanai";
String dirName = "rmi://" + hostName + "/";
String[] servers = Naming.list( dirName );
for( int j=0; j<servers.length; j++ ) {
    StringTokenizer st
       = new StringTokenizer( servers[j], "/" );
    String dummy = st.nextToken();
    String host = st.nextToken();
    String name = st.nextToken();
                :
                :

・ 相手の分散オブジェクトのあるマシン名を知るにはどおしたらいいでしょうか? そのためには、さらに専用のサービスをしてくれる別のサーバが必要になります。 RMIのレベルで処理しようと考えるならば、そうしたサービスをするプログラムを 自前で用意することになります。 JINIや CORBAなどのシステムでは、そのようなサービスがシステムの一部といして実現されます。