." @(#)tnameserv.1 1.1 08/06/17 1 SMI; ." Copyright © 2006 Sun Microsystems, Inc. All Rights Reserved. ." ` .TH tnameserv 1 "17 Jun 2008" ." Generated from HTML pages by html2man (author: Eric Armstrong) .LP .SH "名前" Java IDL:一時ネームサービス \- \f2tnameserv\fP .LP .LP .LP このドキュメントでは、Java IDL 一時ネームサービス \f2tnameserv\fP の使用方法について説明します。Java IDL には、Object Request Broker Daemon (ORBD) も含まれています。ORBD は、ブートストラップサービス、一時ネームサービス、\f3持続\fPネームサービス、およびサーバーマネージャーを含むデーモンプロセスです。Java IDL のすべてのチュートリアルでは ORBD を使用していますが、一時ネームサービスを使用する例では、\f2orbd\fP の代わりに \f2tnameserv\fP を使用できます。\f2orbd\fP ツールの詳細については、\f2orbd\fP の orbd(1)または .na \f2ORBD に含まれる Java IDL ネームサービス\fP @ .fi http://java.sun.com/javase/6/docs/technotes/guides/idl/jidlNaming.htmlに関するトピックを参照してください。 .LP .LP ここでは、以下の項目について説明します。 .LP .RS 3 .TP 2 o Java\ IDL 一時ネームサービス .TP 2 o Java\ IDL 一時ネームサービスの起動 .TP 2 o Java\ IDL 一時ネームサービスの停止 .TP 2 o サンプルクライアント:名前空間へのオブジェクトの追加 .TP 2 o サンプルクライアント:名前空間のブラウズ .RE .LP .SH "Java\ IDL 一時ネームサービス" .LP .LP CORBA の COS (Common Object Services) ネームサービスは、ファイルシステムがファイルに対してディレクトリ構造を提供しているのと同じように、オブジェクト参照に対してツリー構造のディレクトリを提供します。Java IDL の一時ネームサービスである \f2tnameserv\fP は、COS ネームサービスの仕様を単純な形で実装したものです。 .LP .LP オブジェクト参照は名前空間に名前で格納され、オブジェクト参照と名前のペアは、それぞれ「ネームバインディング」と呼ばれます。ネームバインディングは「ネーミングコンテキスト」に組み込むことができます。ネーミングコンテキストはそれ自体がネームバインディングであり、ファイルシステムのサブディレクトリと同じ編成機能を持ちます。すべてのバインディングは「初期ネーミングコンテキスト」に格納されます。名前空間において、初期ネーミングコンテキストは唯一の持続的バインディングです。 それ以外のネーミングコンテキストは、Java IDL のネーミングサービスプロセスが停止し、再起動されると失われます。 .LP .LP アプレットまたはアプリケーションから COS ネームサービスを使用するためには、その ORB はネームサービスが動作しているホストのポートを知っているか、そのネームサービスの文字列化された初期ネーミングコンテキストにアクセスできなければなりません。ネームサービスは、Java\ IDL のネームサービスでもその他の COS 準拠のネームサービスでもかまいません。 .LP .SH "Java\ IDL 一時ネームサービスの起動" .LP .LP Java\ IDL ネームサービスは、ネームサービスを使用するアプリケーションまたはアプレットより前に起動しておかなければなりません。Java\ IDL 製品をインストールすると、Java IDL ネームサービスを起動するスクリプト (Solaris: \f2tnameserv\fP) か、実行可能ファイル (Windows NT: \f2tnameserv.exe\fP) が作成されます。バックグラウンドで動作するように、ネームサービスを起動してください。 .LP .LP 特に指定しない場合、Java IDL ネームサービスは、ORB の \f2resolve_initial_references()\fP メソッドと \f2list_initial_references()\fP メソッドの実装に使用するブートストラッププロトコルに対してポート 900 で待機します。 .LP .nf \f3 .fl tnameserv \-ORBInitialPort \fP\f4nameserverport\fP\f3& .fl \fP .fi .LP .LP ネームサーバーポートを指定しない場合、デフォルトでポート 900 が使用されます。Solaris ソフトウェアの実行時は、1024 より小さいポートでプロセスを開始する場合、root ユーザーになる必要があります。 このため、1024 または 1024 より大きいポートを使用することをお勧めします。 1050 のように別のポートを指定し、ネームサービスをバックグラウンドで実行するには、UNIX コマンドシェルで次のように入力します。 .LP .nf \f3 .fl tnameserv \-ORBInitialPort 1050& .fl \fP .fi .LP .LP Windows の MS\-DOS システムプロンプトでは、次のように入力します。 .LP .nf \f3 .fl start tnameserv \-ORBInitialPort 1050 .fl \fP .fi .LP .LP ネームサーバーのクライアントには、新しいポート番号を知らせる必要があります。このため、ORB オブジェクトの作成時に \f2org.omg.CORBA.ORBInitialPort\fP プロパティーに新しいポート番号を設定します。 .LP .SS 異なるマシン上でのクライアントとサーバーの実行 .LP .LP Java IDL と RMI\-IIOP のほとんどのチュートリアルでは、ネームサービス、サーバー、およびクライアントはすべて開発用のマシン上で実行されます。実際に配備する場合には、クライアントとサーバーを、ネームサービスとは異なるホスト上で実行することが多くなります。 .LP .LP クライアントとサーバーがネームサービスを見つけるには、クライアントとサーバーが、ネームサービスが実行されているポートの番号とホストを認識している必要があります。そのためには、クライアントとサーバーのファイル内の \f2org.omg.CORBA.ORBInitialPort\fP プロパティーと \f2org.omg.CORBA.ORBInitialHost\fP プロパティーをネームサービスが実行されているポートの番号とマシンの名前に設定します。この例は、 .na \f2「RMI\-IIOP を使った Hello World の例」\fP @ .fi http://java.sun.com/javase/6/docs/technotes/guides/rmi\-iiop/rmiiiopexample.htmlに示されています。コマンド行オプション \f2\-ORBInitialPort\fP \f2nameserverport#\fP と \f2\-ORBInitialHost\fP \f2nameserverhostname\fP を使用して、クライアントとサーバーに対してネームサービスを探す場所を指定することもできます。 .na \f2「Java IDL: 2 台のマシン上で実行する Hello World プログラム」\fP @ .fi http://java.sun.com/javase/6/docs/technotes/guides/idl/tutorial/jidl2machines.html には、コマンド行オプションを使用して指定する方法が示されています。 .LP .LP たとえば、一時ネームサービス \f2tnameserv\fP が、ホスト \f2nameserverhost\fP のポート 1050 上で実行されているとします。さらに、クライアントがホスト \f2clienthost\fP 上で実行され、サーバーはホスト \f2serverhost\fP 上で実行されているとします。 .LP .RS 3 .TP 2 o 次のように、ホスト \f2nameserverhost\fP 上で \f2tnameserv\fP を起動します。 .nf \f3 .fl tnameserv \-ORBInitialPort 1050 .fl .fl \fP .fi .TP 2 o \f2serverhost\fP 上でサーバーを起動します。 .nf \f3 .fl java Server \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost .fl \fP .fi .TP 2 o \f2clienthost\fP 上でクライアントを起動します。 .nf \f3 .fl java Client \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost .fl \fP .fi .RE .LP .SS \-J オプション .LP このコマンド行オプションは、\f2tnameserve\fP とともに使用できます。 .RS 3 .LP .RS 3 .TP 3 \-Joption Java 仮想マシンに \f2option\fP を渡します。 \f2option\fP には、java(1)のリファレンスページに記載されているオプションを 1 つ指定します。たとえば、\f3\-J\-Xms48m\fP と指定すると、スタートアップメモリーは 48M バイトに設定されます。\f3\-J\fP を使って背後の実行環境にオプションを渡すことはよく行われています。 .RE .LP .RE .SH "Java\ IDL 一時ネームサービスの停止" .LP .LP Java IDL ネームサービスを停止するには、Unix の場合は、\f2kill\fP などのオペレーティングシステムのコマンドを使い、Windows の場合は、\f2Ctrl\-C\fP を使います。ネームサービスを明示的に停止するまでは、呼び出し待機状態が続きます。なお、サービスを終了させると、Java\ IDL ネームサービスに登録されている名前は失われます。 .LP .SH "サンプルクライアント:名前空間へのオブジェクトの追加" .LP .LP 次に示すサンプルプログラムは、名前を名前空間に追加する方法を示すものです。このサンプルプログラムは、このままの状態で完全に動作する一時ネームサービスクライアントで、次のような単純なツリーを作成するものです。 .LP .nf \f3 .fl \fP\f3 .fl \fP\f4初期\fP\f3 .fl \fP\f4ネーミングコンテキスト\fP\f3 .fl / \\ .fl / \\ .fl plans \fP\f4Personal\fP\f3 .fl / \\ .fl / \\ .fl calendar schedule\fP .fl .fi .LP .LP この例で、\f3plans\fP はオブジェクト参照、\f3Personal\fP は \f3calendar\fP と \f3schedule\fP の 2 つのオブジェクト参照を含むネーミングコンテキストです。 .LP .nf \f3 .fl import java.util.Properties; .fl import org.omg.CORBA.*; .fl import org.omg.CosNaming.*; .fl .fl public class NameClient .fl { .fl public static void main(String args[]) .fl { .fl try { .fl \fP .fi .LP 前述の「Java IDL 一時ネームサービスの起動」で、ネームサーバーはポート 1050 を使用して起動しました。 次のコードで、このポート番号をクライアントプログラムに知らせます。 .nf \f3 .fl Properties props = new Properties(); .fl props.put("org.omg.CORBA.ORBInitialPort", "1050"); .fl ORB orb = ORB.init(args, props); .fl .fl \fP .fi .LP 次のコードでは、初期ネーミングコンテキストを取得し、それを \f3ctx\fP に代入します。2 行目では、\f3ctx\fP をダミーのオブジェクト参照 \f3objref\fP にコピーします。 この \f3objref\fP には、あとでさまざまな名前を割り当てて名前空間に追加します。 .nf \f3 .fl NamingContext ctx = .fl NamingContextHelper.narrow(orb.resolve_initial_references("NameService")); .fl NamingContext objref = ctx; .fl .fl \fP .fi .LP 次のコードでは、text 型の名前 plans を作成し、それをダミーのオブジェクト参照にバインドします。その後、\f2rebind\fP を使用して初期ネーミングコンテキストの下に "plans" を追加しています。\f2rebind\fP メソッドを使用すれば、\f2bind\fP を使用した場合に発生する例外を発生させずに、このプログラムを何度も繰り返し実行できます。 .nf \f3 .fl NameComponent nc1 = new NameComponent("plans", "text"); .fl NameComponent[] name1 = {nc1}; .fl ctx.rebind(name1, objref); .fl System.out.println("plans rebind sucessful!"); .fl .fl \fP .fi .LP 次のコードでは、directory 型の Personal というネーミングコンテキストを作成します。その結果得られるオブジェクト参照 \f3ctx2\fP をこの名前にバインドし、初期ネーミングコンテキストに追加します。 .nf \f3 .fl NameComponent nc2 = new NameComponent("Personal", "directory"); .fl NameComponent[] name2 = {nc2}; .fl NamingContext ctx2 = ctx.bind_new_context(name2); .fl System.out.println("new naming context added.."); .fl .fl \fP .fi .LP 残りのコードでは、ダミーのオブジェクト参照を schedule と calendar という名前でネーミングコンテキスト "Personal" (\f3ctx2\fP) にバインドします。 .nf \f3 .fl NameComponent nc3 = new NameComponent("schedule", "text"); .fl NameComponent[] name3 = {nc3}; .fl ctx2.rebind(name3, objref); .fl System.out.println("schedule rebind sucessful!"); .fl .fl NameComponent nc4 = new NameComponent("calender", "text"); .fl NameComponent[] name4 = {nc4}; .fl ctx2.rebind(name4, objref); .fl System.out.println("calender rebind sucessful!"); .fl .fl .fl } catch (Exception e) { .fl e.printStackTrace(System.err); .fl } .fl } .fl } .fl \fP .fi .LP .SH "サンプルクライアント:名前空間のブラウズ" .LP .LP 次のサンプルプログラムでは、名前空間をブラウズする方法を示します。 .LP .nf \f3 .fl import java.util.Properties; .fl import org.omg.CORBA.*; .fl import org.omg.CosNaming.*; .fl .fl public class NameClientList .fl { .fl public static void main(String args[]) .fl { .fl try { .fl \fP .fi .LP 前述の「Java IDL 一時ネームサービスの起動」で、ネームサーバーはポート 1050 を使用して起動しました。 次のコードで、このポート番号をクライアントプログラムに知らせます。 .nf \f3 .fl .fl Properties props = new Properties(); .fl props.put("org.omg.CORBA.ORBInitialPort", "1050"); .fl ORB orb = ORB.init(args, props); .fl .fl .fl \fP .fi .LP 次のコードでは、初期ネーミングコンテキストを取得しています。 .nf \f3 .fl NamingContext nc = .fl NamingContextHelper.narrow(orb.resolve_initial_references("NameService")); .fl .fl \fP .fi .LP \f2list\fP メソッドは、ネーミングコンテキストに追加されているバインディングをリストします。この場合、最大 1000 個までのバインディングが初期ネーミングコンテキストから BindingListHolder に返されます。 残りのバインディングは、BindingIteratorHolder に返されます。 .nf \f3 .fl BindingListHolder bl = new BindingListHolder(); .fl BindingIteratorHolder blIt= new BindingIteratorHolder(); .fl nc.list(1000, bl, blIt); .fl .fl \fP .fi .LP 次のコードでは、返された BindingListHolder からバインディングの配列を取得します。バインディングがない場合は、プログラムは終了します。 .nf \f3 .fl Binding bindings[] = bl.value; .fl if (bindings.length == 0) return; .fl .fl \fP .fi .LP 残りのコードでは、バインディングに対してループ処理を行い、名前を出力します。 .nf \f3 .fl for (int i=0; i < bindings.length; i++) { .fl .fl // get the object reference for each binding .fl org.omg.CORBA.Object obj = nc.resolve(bindings[i].binding_name); .fl String objStr = orb.object_to_string(obj); .fl int lastIx = bindings[i].binding_name.length\-1; .fl .fl // check to see if this is a naming context .fl if (bindings[i].binding_type == BindingType.ncontext) { .fl System.out.println( "Context: " + .fl bindings[i].binding_name[lastIx].id); .fl } else { .fl System.out.println("Object: " + .fl bindings[i].binding_name[lastIx].id); .fl } .fl } .fl .fl } catch (Exception e) { .fl e.printStackTrace(System.err); .fl } .fl } .fl } .fl \fP .fi .LP .LP