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ネーム・サービスに登録されている名前は失われます。
オプション
-JoptionJVMに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)
        }
    }
}