ここでは、以下の項目について説明します。
CORBA の COS (Common Object Services) ネームサービス は、ファイルシステムがファイルに対してディレクトリ構造を提供しているのと同じように、オブジェクト参照に対してツリー構造のディレクトリを提供します。Java IDL のネームサービスは、COS ネームサービスの仕様を単純な形で実装したものです。
オブジェクト参照は名前空間に名前で格納され、オブジェクト参照と名前の組は、それぞれ「ネームバインディング」と呼ばれます。ネームバインディングは「ネーミングコンテキスト」に組み込むことができます。ネーミングコンテキストはそれ自体がネームバインディングであり、ファイルシステムのサブディレクトリと同じ編成機能を持ちます。すべてのバインディングは「初期ネーミングコンテキスト」に格納されます。名前空間において、初期ネーミングコンテキストは唯一の持続的バインディングです。 それ以外のネーミングコンテキストは、Java IDL のネームサーバプロセスが停止し、再起動されると失われます。
アプレットまたはアプリケーションから COS ネームサービスを使用するためには、その ORB はネームサービスが動作しているホストの名前とポートを知っているか、そのネームサーバの文字列化された初期ネーミングコンテキストにアクセスできなければなりません。ネームサービスは、Java IDL のネームサーバでもその他の COS 準拠のネームサービスでもかまいません。
Java IDL ネームサーバの起動
Java IDL ネームサーバは、ネームサービスを使用するアプリケーションまたはアプレットより前に起動しておかなければなりません。 Java IDL 製品をインストールすると、 Java IDL ネームサーバを起動するスクリプト (Solaris: tnameserv) か、実行可能ファイル (Windows NT: tnameserv.exe) が作成されます。バックグラウンドで動作するように、ネームサーバを起動してください。
特に指定しない場合、Java IDL ネームサーバは、ORB の resolve_initial_references() メソッドと list_initial_references() メソッドの実装に使用するブートストラッププロトコルに対してポート 900 で待機します。ほかのポート (1050 など) を指定するには、次のようにします。
tnameserv -ORBInitialPort 1050
ネームサーバのクライアントには、新しいポート番号を知らせる必要があります。 このため、ORB オブジェクトの作成時に org.omg.CORBA.ORBInitialPort プロパティに新しいポート番号を設定します。
Java IDL ネームサーバの停止
Java IDL ネームサーバを停止するには、kill などのオペレーティングシステムのコマンドを使います。なお、ネームサーバを終了させると、Java IDL ネームサービスに登録されている名前は失われます。
以下に示すサンプルプログラムは、名前を名前空間に追加する方法を示すものです。このサンプルプログラムは、このままの状態で完全に動作するネームサーバクライアントで、次のような単純なツリーを作成するものです。
この例で、plans はオブジェクト参照、Personal は calendar と schedule の 2 つのオブジェクト参照が含まれるネーミングコンテキストです。
import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class NameClient
{
public static void main(String args[])
{
try {
前述の「Java IDL ネームサーバの起動」で、ネームサーバはポート 1050 を使用して起動しました。 次のコードで、このポート番号をクライアントプログラムに知らせます。
Properties props = new Properties();
props.put("org.omg.CORBA.ORBInitialPort", "1050");
ORB orb = ORB.init(args, props);
次のコードでは、初期ネーミングコンテキストを取得し、それを ctx に代入します。2 行目では、ctx をダミーのオブジェクト参照 objref にコピーします。 この objref には、あとでさまざまな名前を割り当てて名前空間に追加します。
NamingContext ctx = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
NamingContext objref = ctx;
次のコードでは、text 型の名前 plans を作成し、それをダミーのオブジェクト参照にバインドします。その後、rebind を使用して初期ネーミングコンテキストの下に "plans" を追加しています。rebind メソッドを使用すれば、bind を使用した場合に発生する例外を発生させずに、このプログラムを何度も繰り返し実行できます。
NameComponent nc1 = new NameComponent("plans", "text");
NameComponent[] name1 = {nc1};
ctx.rebind(name1, objref);
System.out.println("plans rebind sucessful!");
次のコードでは、directory 型の Personal というネーミングコンテキストを作成します。その結果得られるオブジェクト参照 ctx2 をこの名前にバインドし、初期ネーミングコンテキストに追加します。
NameComponent nc2 = new NameComponent("Personal", "directory");
NameComponent[] name2 = {nc2};
NamingContext ctx2 = ctx.bind_new_context(name2);
System.out.println("new naming context added..");
残りのコードでは、ダミーのオブジェクト参照を schedule と calendar という名前でネーミングコンテキスト "Personal" (ctx2) にバインドします。
NameComponent nc3 = new NameComponent("schedule", "text");
NameComponent[] name3 = {nc3};
ctx2.rebind(name3, objref);
System.out.println("schedule rebind sucessful!");
NameComponent nc4 = new NameComponent("calender", "text");
NameComponent[] name4 = {nc4};
ctx2.rebind(name4, objref);
System.out.println("calender rebind sucessful!");
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
次のサンプルプログラムでは、名前空間をブラウズする方法を示します。
import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class NameClientList
{
public static void main(String args[])
{
try {
前述の「Java IDL ネームサーバの起動」で、ネームサーバはポート 1050 を使用して起動しました。 次のコードで、このポート番号をクライアントプログラムに知らせます。
Properties props = new Properties();
props.put("org.omg.CORBA.ORBInitialPort", "1050");
ORB orb = ORB.init(args, props);
次のコードでは、初期ネーミングコンテキストを取得しています。
NamingContext nc = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
list メソッドは、ネーミングコンテキストに追加されているバインディングを表示します。この場合、最大 1000 個までのバインディングが初期ネーミングコンテキストから BindingListHolder に返されます。 残りのバインディングは、BindingIteratorHolder に返されます。
BindingListHolder bl = new BindingListHolder();
BindingIteratorHolder blIt= new BindingIteratorHolder();
nc.list(1000, bl, blIt);
次のコードでは、返された BindingListHolder からバインディングの配列を取得します。バインディングがない場合は、プログラムは終了します。
Binding bindings[] = bl.value;
if (bindings.length == 0) return;
残りのコードでは、バインディングに対してループ処理を行い、名前を出力します。
for (int i=0; i < bindings.length; i++) {
// get the object reference for each binding
org.omg.CORBA.Object obj = nc.resolve(bindings[i].binding_name);
String objStr = orb.object_to_string(obj);
int lastIx = bindings[i].binding_name.length-1;
// check to see if this is a naming context
if (bindings[i].binding_type == BindingType.ncontext) {
System.out.println("Context: " + bindings[i].binding_name[lastIx].id);
} else {
System.out.println("Object: " + bindings[i].binding_name[lastIx].id);
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
| ホーム |