tnameserv(1)

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

このドキュメントでは、Java IDL 一時ネームサービス tnameserv の使用方法について説明します。Java IDL には ORBD (Object Request Broker Daemon) も含まれています。ORBD は、ブートストラップサービス、一時ネームサービス、持続ネームサービス、およびサーバーマネージャを含むデーモンプロセスです。Java IDL のすべてのチュートリアルでは ORBD が使用されていますが、一時ネームサービスを使用する例の orbd はどれも、tnameserv で置き換えることができます。orbd ツールのドキュメントについては、そのマニュアルページか、 Java IDL Naming Service Included with ORBD
(http://java.sun.com/javase/6/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 プロパティを、ネームサービスが実行されているマシン名とポート番号に設定します。この例については、 「The Hello World Example Using RMI-IIOP」
(http://java.sun.com/javase/6/docs/technotes/guides/rmi-iiop/rmiiiopexample.html) を参照してください。また、コマンド行オプション -ORBInitialPort nameserverport# と -ORBInitialHost nameserverhostname を使ってネームサービスの検索場所をクライアントとサーバーに知らせることも可能です。 「Java IDL: Running the Hello World Example on TWO Machines」
(http://java.sun.com/javase/6/docs/technotes/guides/idl/tutorial/jidl2machines.html) では、このコマンド行オプションを使う方法の 1 つが示されています。

たとえば、一時ネームサービス 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 オプション

tnameserv で使用可能なコマンド行オプションは、次のとおりです。

    -Joption
        option を Java 仮想マシンに渡します。ここで、option は、 Java アプリケーション起動ツール
        (http://java.sun.com/javase/6/docs/technotes/tools/solaris/java.html) のリファレンスページで説明されているオプションの 1 つです。たとえば、-J-Xms48m とすると、起動時のメモリが 48M バイトに設定されます。-J を使って実行元の仮想マシンにオプションを渡すことは、よく行われています。

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

Java IDL ネームサービスを停止するには、対応するオペレーティングシステムコマンドを使用します。たとえば、Unix プロセスの場合は kill を、Windows プロセスの場合は Ctrl-C を、それぞれ使用します。ネームサービスは明示的にシャットダウンされるまで、呼び出しを待ち続けます。なお、ネームサービスを終了させると、Java IDL ネームサービスに登録されている名前は失われます。

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

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

                    初期
           ネーミングコンテキスト
                  /      \
                 /        \
              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 sucessful!");

このコードでは、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 sucessful!");
        NameComponent nc4 = new NameComponent("calender", "text");
        NameComponent[] name4 = {nc4};
        ctx2.rebind(name4, objref);
        System.out.println("calender rebind sucessful!");
    } 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);
       }
   }
}