インタフェース定義言語(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/jp/8/technotes/guides/rmi-iiop/rmiiiopexample.html
コマンド行オプション-ORBInitialPort nameserverport#
と-ORBInitialHost nameserverhostname
を使用して、クライアントとサーバーに対してネーム・サービスを探す場所を指定することもできます。このコマンド行オプションの使用例については、「Java IDL: 2台のマシンで実行するHello Worldプログラム」を参照してください。
http://docs.oracle.com/javase/jp/8/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) } } }