tnameserve -ORBInitialPort [ nameserverport ]
-ORBInitialPort nameserverport
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 にあるまたは「Naming Service」を参照してください。
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プロパティをネーム・サービスが実行されているポートの番号とマシンの名前に設定します。この例は、「Getting Started Using RMI-IIOP」 (http://docs.oracle.com/javase/8/docs/technotes/guides/rmi-iiop/rmiiiopexample.html)に示されています
コマンド行オプション-ORBInitialPort nameserverport#と-ORBInitialHost nameserverhostnameを使用して、クライアントとサーバーに対してネーミング・サービスを探す場所を指定することもできます。コマンド行オプションを使用してこれを行う方法の1つの例は、http://docs.oracle.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines.htmlの「Java IDL: The Hello World Example on Two Machines」 を参照してください
たとえば、一時ネーム・サービス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 IDLネーミング・サービスを停止するには、Solaris、LinuxまたはOS Xの場合は、killなどのオペレーティング・システムのコマンドを使用し、Windowsの場合は、[Ctrl]+[C]キーを使用します。ネーミング・サービスを明示的に停止するまでは、呼出し待機状態が続きます。サービスを終了させると、Java IDLネーム・サービスに登録されている名前は失われます。
-Joption
次の例では、ネームスペースに名前を追加する方法を示します。このサンプル・プログラムは、自己完結型の一時ネーム・サービス・クライアントで、次のような単純なツリーを作成するものです。
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行目では、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 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) } } }