tnameserv(1)

名前
Java IDL: 一時ネーム・サービス - tnameserv

このドキュメントでは、Java IDL一時ネーム・サービスtnameservの使用方法について説明します。Java IDLには、Object Request Broker Daemon(ORBD)も含まれています。ORBDは、ブートストラップ・サービス、一時ネーム・サービス、永続ネーム・サービスおよびサーバー・マネージャを含むデーモン・プロセスです。Java IDLのすべてのチュートリアルではORBDを使用していますが、一時ネーム・サービスを使用する例では、orbdのかわりにtnameservを使用できます。orbdツールの詳細は、orbdのorbd(1)または ORBDに含まれるJava IDLネーム・サービス @
http://docs.oracle.com/javase/7/docs/technotes/guides/idl/jidlNaming.htmlに関するトピックを参照してください。

ここでは、以下の項目について説明します。

    o   Java IDL一時ネーム・サービス

    o   Java IDL一時ネーム・サービスの起動

    o   Java IDL一時ネーム・サービスの停止

    o   サンプル・クライアント: 名前空間へのオブジェクトの追加

    o   サンプル・クライアント: 名前空間のブラウズ

Java IDL一時ネーム・サービス

CORBAのCOS(Common Object Services)ネーム・サービスは、ファイル・システムがファイルに対してディレクトリ構造を提供しているのと同じように、オブジェクト参照に対してツリー構造のディレクトリを提供します。Java IDLの一時ネーム・サービスであるtnameservは、COSネーム・サービスの仕様を単純な形で実装したものです。

オブジェクト参照は名前空間に名前で格納され、オブジェクト参照と名前のペアは、それぞれネーム・バインディングと呼ばれます。ネーム・バインディングはネーミング・コンテキストに組み込むことができます。ネーミング・コンテキストはそれ自体がネーム・バインディングであり、ファイル・システムのサブディレクトリと同じ編成機能を持ちます。すべてのバインディングは初期ネーミング・コンテキストに格納されます。名前空間において、初期ネーミング・コンテキストは唯一の永続的バインディングです。それ以外のネーミング・コンテキストは、Java IDLのネーミング・サービス・プロセスが停止し、再起動されると失われます。

アプレットまたはアプリケーションからCOSネーム・サービスを使用するためには、そのORBがネーム・サービスが動作しているホストのポートを知っているか、そのネーム・サービスの文字列化された初期ネーミング・コンテキストにアクセスできる必要があります。ネーム・サービスは、Java IDLのネーム・サービスでもその他のCOS準拠のネーム・サービスでもかまいません。

Java IDL一時ネーム・サービスの起動

Java IDLネーム・サービスは、ネーム・サービスを使用するアプリケーションまたはアプレットより前に起動しておく必要があります。Java IDL製品をインストールすると、Java IDLネーム・サービスを起動するスクリプト(Solaris: tnameserv)または実行可能ファイル(Windows NT: tnameserv.exe)が作成されます。バックグラウンドで動作するように、ネーム・サービスを起動してください。

特に指定しない場合、Java IDLネーム・サービスは、ORBのresolve_initial_references()メソッドとlist_initial_references()メソッドの実装に使用するブートストラップ・プロトコルに対してポート900で待機します。

        tnameserv -ORBInitialPort nameserverport&

ネーム・サーバー・ポートを指定しない場合、デフォルトでポート900が使用されます。Solarisソフトウェアの実行時は、1024より小さいポートでプロセスを開始する場合、rootユーザーになる必要があります。このため、1024以上のポート番号を使用することをお薦めします。1050のように別のポートを指定し、ネーム・サービスをバックグラウンドで実行するには、UNIXコマンド・シェルで次のように入力します。

        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を使用したHello Worldの例 @
http://docs.oracle.com/javase/7/docs/technotes/guides/rmi-iiop/rmiiiopexample.htmlに示されています。コマンドライン・オプション-ORBInitialPort nameserverport#と-ORBInitialHost nameserverhostnameを使用して、クライアントとサーバーに対してネーム・サービスを探す場所を指定することもできます。 Java IDL: 2台のマシン上で実行するHello Worldプログラム @
http://docs.oracle.com/javase/7/docs/technotes/guides/idl/tutorial/jidl2machines.htmlには、コマンドライン・オプションを使用して指定する方法が示されています。

たとえば、一時ネーム・サービスtnameservが、ホストnameserverhostのポート1050上で実行されているとします。さらに、クライアントがホストclienthost上で実行され、サーバーはホストserverhost上で実行されているとします。

    o   次のように、ホストnameserverhost上でtnameservを起動します。

             tnameserv -ORBInitialPort 1050

    o   次のように、serverhost上でサーバーを起動します。

             java Server -ORBInitialPort 1050 -ORBInitialHost nameserverhost

    o   次のように、clienthost上でクライアントを起動します。

             java Client -ORBInitialPort 1050 -ORBInitialHost nameserverhost

  -Jオプション

このコマンドライン・オプションは、tnameserveとともに使用できます。

    -Joption
        Java仮想マシンにoptionを渡します。optionには、java(1)のリファレンス・ページに記載されているオプションを1つ指定します。たとえば、-J-Xms48mと指定すると、スタートアップ・メモリーは48Mバイトに設定されます。-Jを使用して背後の仮想マシンにオプションを渡すことはよく行われています。

Java IDL一時ネーム・サービスの停止

Java IDLネーム・サービスを停止するには、Unixの場合は、killなどのオペレーティング・システムのコマンドを使用し、Windowsの場合は、[Ctrl]+[C]キーを使用します。ネーム・サービスを明示的に停止するまでは、呼出し待機状態が続きます。サービスを終了させると、Java IDLネーム・サービスに登録されている名前は失われます。

サンプル・クライアント: 名前空間へのオブジェクトの追加

次に示すサンプル・プログラムは、名前を名前空間に追加する方法を示すものです。このサンプル・プログラムは、このままの状態で完全に動作する一時ネーム・サービス・クライアントで、次のような単純なツリーを作成するものです。

    o   初期ネーミング・コンテキスト

        *   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 {

前述のJava IDL一時ネーム・サービスの起動で、ネーム・サーバーはポート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をこの名前にバインドし、初期ネーミング・コンテキストに追加します。

        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 {

前述のJava IDL一時ネーム・サービスの起動で、ネーム・サーバーはポート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);
       }
   }
}