tnameserv
コマンドは、Object Request Broker Daemon (ORBD)の代替として使用します。
形式
tnameserve -ORBInitialPort [ nameserverport ]
説明
Javaインタフェース定義言語(IDL)には、Object Request Broker Daemon (ORBD)が含まれています。ORBDは、ブートストラップ・サービス、一時ネーム・サービス、持続ネーム・サービスおよびサーバー・マネージャを含むデーモン・プロセスです。Java IDLのすべてのチュートリアルでORBDが使用されていますが、一時ネーム・サービスを使用する例では、orbd
コマンドの代わりにtnameserv
コマンドを使用できます。
CORBAのCOS (Common Object Services)ネーム・サービスは、ファイル・システムがファイルに対してディレクトリ構造を提供しているのと同じように、オブジェクト参照に対してツリー構造のディレクトリを提供します。Java IDLの一時ネーム・サービスであるtnameserv
は、COSネーム・サービスの仕様を単純な形で実装したものです。
オブジェクト参照は名前空間に名前で格納され、それぞれのオブジェクト参照と名前のペアはネーム・バインディングと呼ばれます。ネーム・バインディングはネーミング・コンテキストに組み込むことができます。ネーミング・コンテキストはネーム・バインディングであり、ファイル・システムのサブディレクトリと同じ編成機能を持ちます。すべてのバインディングは初期ネーミング・コンテキストの下に格納されます。初期ネーミング・コンテキストは、名前空間内の唯一の持続バインディングです。残りの名前空間は、Java IDLのネーム・サービス・プロセスが停止し、再起動されると失われます。
アプレットまたはアプリケーションでCOSネーム・サービスを使用するには、そのORBDが、ネーム・サービスが稼働しているホストのポートを認識しているか、そのネーム・サービスの初期ネーミング・コンテキスト文字列へのアクセス権を持っている必要があります。ネーム・サービスは、Java IDLのネーム・サービスでもその他のCOS準拠のネーム・サービスでもかまいません。
ネーム・サービスを起動する
Java IDLネーム・サービスは、ネーム・サービスを使用するアプリケーションまたはアプレットより前に起動しておかなければなりません。Java IDL製品をインストールすると、Java IDLネーム・サービスを起動するスクリプト(Oracle Solaris、LinuxおよびOS X: tnameserv
)または実行可能ファイル(Windows: tnameserv.exe
)が作成されます。バックグラウンドで稼働するように、ネーム・サービスを起動してください。
特に指定しない場合、Java IDLネーム・サービスは次のように、Object Request Broker (ORB)のresolve_initial_references
およびlist_initial_references methods
の実装に使用されるブートストラップ・プロトコルをポート900でリスニングにします。
tnameserv -ORBInitialPort nameserverport&
ネーム・サーバーのポートを指定しない場合、デフォルトでポート900が使用されます。Oracle Solarisソフトウェアの実行時は、1024より小さいポートでプロセスを開始する際に、rootユーザーになる必要があります。このため、1024以上のポート番号を使用することをお薦めします。1050などの別のポートを指定し、ネーム・サービスをバックグラウンドで実行するには、Oracle 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
プロパティをネーム・サービスが実行されているポートの番号とマシンの名前に設定します。
コマンド行オプション-ORBInitialPort nameserverport#
と-ORBInitialHost nameserverhostname
を使用して、クライアントとサーバーに対してネーム・サービスを探す場所を指定することもできます。
たとえば、一時ネーム・サービス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ネーム・サービスを停止するには、Oracle Solaris、LinuxまたはOS Xプロセスの場合は、kill
などの関連するオペレーティング・システム・コマンドを使用し、Windowsプロセスの場合は、[Ctrl]+[C]を使用します。ネーム・サービスを明示的に停止するまでは、呼出し待機状態が続きます。なお、サービスを終了させると、Java IDLネーム・サービスに登録されている名前は失われます。
オプション
-Joption
JVMにoption
を渡します(option
は、Javaアプリケーション・ランチャのリファレンス・ページに記載されているいずれかのオプションです)。たとえば、-J-Xms48m
と指定すると、スタートアップ・メモリーは48Mバイトに設定されます。「javaのオプションの概要」を参照してください。
ネームスペースへのオブジェクトの追加例
この例では、次の単純なツリーに名前を追加する方法を示します。
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
を作成し、それをダミーのオブジェクト参照にバインドします。その後、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("calendar", "text"); NameComponent[] name4 = {nc4}; ctx2.rebind(name4, objref); System.out.println("calendar 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) } } }