インタフェース定義言語(IDL)。
tnameserve -ORBInitialPort [ nameserverport ]
ネーム・サービスがブートストラップ・プロトコルを待機する初期ポートです。このプロトコルは、ORBのresolve_initial_referencesメソッドとlist_initial_referencesメソッドを実装する際に使用されます。
Java IDLには、Object Request Broker Daemon (ORBD)が含まれています。 ORBDは、ブートストラップ・サービス、一時ネーム・サービス、持続ネーム・サービスおよびサーバー・マネージャを含むデーモン・プロセスです。 Java IDLのすべてのチュートリアルでORBDが使用されていますが、一時ネーム・サービスを使用する例では、orbdコマンドの代わりにtnameservコマンドを使用できます。
orbd(1)または「ネーム・サービス」を参照してください。
http://docs.oracle.com/javase/8/docs/technotes/guides/idl/jidlNaming.html
CORBAのCOS (Common Object Services)ネーム・サービスは、ファイル・システムがファイルに対してディレクトリ構造を提供しているのと同じように、オブジェクト参照に対してツリー構造のディレクトリを提供します。 Java IDLの一時ネーム・サービスであるtnameservは、COSネーム・サービスの仕様を単純な形で実装したものです。
オブジェクト参照は名前空間に名前で格納され、それぞれのオブジェクト参照と名前のペアはネーム・バインディングと呼ばれます。 ネーム・バインディングはネーミング・コンテキストに組み込むことができます。 ネーミング・コンテキストはネーム・バインディングであり、ファイル・システムのサブディレクトリと同じ編成機能を持ちます。 すべてのバインディングは初期ネーミング・コンテキストの下に格納されます。 初期ネーミング・コンテキストは、名前空間内の唯一の持続バインディングです。 残りの名前空間は、Java IDLのネーム・サービス・プロセスが停止し、再起動されると失われます。
アプレットまたはアプリケーションでCOSネーム・サービスを使用するには、そのORBがネーム・サービスが動作しているホストのポートを認識しているか、そのネーム・サービスの初期ネーミング・コンテキスト文字列へのアクセス権を持っている必要があります。 ネーム・サービスは、Java IDLのネーム・サービスでもその他のCOS準拠のネーム・サービスでもかまいません。
Java IDLネーム・サービスは、ネーム・サービスを使用するアプリケーションまたはアプレットより前に起動しておかなければなりません。 Java IDL製品をインストールすると、Java IDLネーム・サービスを起動するスクリプト(Oracle Solaris: tnameserv)または実行可能ファイル(Windows: tnameserv.exe)が作成されます。 バックグラウンドで動作するように、ネーム・サービスを起動してください。
特に指定しない場合、Java IDLネーム・サービスは次のように、ORBのresolve_initial_referencesとlist_initial_references methodsの実装に使用されるブートストラップ・プロトコルをポート900で待機します。
tnameserv -ORBInitialPort nameserverport&
ネーム・サーバーのポートを指定しない場合、デフォルトでポート900が使用されます。 Oracle Solarisソフトウェアの実行時は、1024より小さいポートでプロセスを開始する際に、rootユーザーになる必要があります。 このため、1024以上のポート番号を使用することをお薦めします。 1050のように別のポートを指定し、ネーム・サービスをバックグラウンドで実行するには、Solaris、LinuxまたはOS Xコマンド・シェルで次のように入力します。
tnameserv -ORBInitialPort 1050&
WindowsのMS-DOSシステム・プロンプトでは、次のように入力します。
start tnameserv -ORBInitialPort 1050
ネーム・サーバーのクライアントには、新しいポート番号を知らせる必要があります。 このため、ORBオブジェクトの作成時にorg.omg.CORBA.ORBInitialPortプロパティに新しいポート番号を設定します。
Java IDLとRMI-IIOPのほとんどのチュートリアルでは、ネーム・サービス、サーバーおよびクライアントはすべて開発用のマシン上で実行されます。 実際に配備する際には、クライアントとサーバーをネーム・サービスとは異なるホスト上で実行することが多くあります。
クライアントとサーバーがネーム・サービスを見つけるには、クライアントとサーバーが、ネーム・サービスが実行されているポートの番号とホストを認識している必要があります。 そのためには、クライアントとサーバーのファイル内のorg.omg.CORBA.ORBInitialPortプロパティとorg.omg.CORBA.ORBInitialHostプロパティをネーム・サービスが実行されているポートの番号とマシンの名前に設定します。 この例は、RMI-IIOPの使用の開始(
http://docs.oracle.com/javase/8/docs/technotes/guides/rmi-iiop/rmiiiopexample.html)に示されています。
コマンド行オプション-ORBInitialPort nameserverport#と-ORBInitialHost nameserverhostnameを使用して、クライアントとサーバーに対してネーム・サービスを探す場所を指定することもできます。 コマンドライン・オプションを使用してこれを行う例については、Java IDL: The Hello World Example on Two Machines (
http://docs.oracle.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines.html)を参照してください。
たとえば、一時ネーム・サービスtnameservが、ホストnameserverhostのポート1050上で実行されているとします。 さらに、クライアントがホストclienthost上で実行され、サーバーはホストserverhost上で実行されているとします。
ホストnameserverhost上でtnameservを起動します。
tnameserv -ORBInitialPort 1050
serverhost上でサーバーを起動します。
java Server -ORBInitialPort 1050 -ORBInitialHost nameserverhost
clienthost上でクライアントを起動します。
java Client -ORBInitialPort 1050 -ORBInitialHost nameserverhost
Java仮想マシンにoptionを渡します(optionは、Javaアプリケーション起動ツールのリファレンス・ページに記載されているいずれかのオプション)。 たとえば、-J-Xms48mと指定すると、スタートアップ・メモリーは48Mバイトに設定されます。 java(1)を参照してください。
次の例は、名前を名前空間に追加する方法を示しています。 これは自己完結型の一時ネーム・サービス・クライアントで、次のような単純なツリーを作成するものです。
Initial Naming Context
plans
Personal
calendar
schedule
この例で、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 {
「ネーム・サービスの起動」では、nameserverがポート1050で起動されました。 次のコードによって、クライアント・プログラムはこのポート番号を確実に認識します。
Properties props = new Properties();
props.put("org.omg.CORBA.ORBInitialPort", "1050");
ORB orb = ORB.init(args, props);
このコードでは、初期ネーミング・コンテキストが取得され、それがctxに割り当てられます。 2行目では、様々な名前に割り当てられ、名前空間に追加されるダミーのオブジェクト参照objrefに、ctxがコピーされます。
NamingContext ctx =
NamingContextHelper.narrow(
orb.resolve_initial_references("NameService"));
NamingContext objref = ctx;
このコードでは、text型の名前plansが作成され、それがダミーのオブジェクト参照にバインドされます。その後、plansは、rebindメソッドを使用して初期ネーミング・コンテキストの下に追加されます。 rebindメソッドを使用すれば、bindメソッドを使用したときに発生する例外を発生させずに、このプログラムを何度も繰返し実行できます。
NameComponent nc1 = new NameComponent("plans", "text");
NameComponent[] name1 = {nc1};
ctx.rebind(name1, objref);
System.out.println("plans rebind successful!");
このコードでは、directory型のPersonalというネーミング・コンテキストが作成されます。 その結果得られるオブジェクト参照ctx2がnameにバインドされ、初期ネーミング・コンテキストの下に追加されます。
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 successful!");
NameComponent nc4 = new NameComponent("calender", "text");
NameComponent[] name4 = {nc4};
ctx2.rebind(name4, objref);
System.out.println("calender rebind successful!");
} 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 {
「ネーム・サービスの起動」では、nameserverがポート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)
}
}
}