1 ." Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
   2 ." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   3 ."
   4 ." This code is free software; you can redistribute it and/or modify it
   5 ." under the terms of the GNU General Public License version 2 only, as
   6 ." published by the Free Software Foundation.
   7 ."
   8 ." This code is distributed in the hope that it will be useful, but WITHOUT
   9 ." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 ." FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  11 ." version 2 for more details (a copy is included in the LICENSE file that
  12 ." accompanied this code).
  13 ."
  14 ." You should have received a copy of the GNU General Public License version
  15 ." 2 along with this work; if not, write to the Free Software Foundation,
  16 ." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  17 ."
  18 ." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  19 ." or visit www.oracle.com if you need additional information or have any
  20 ." questions.
  21 ."
  22 .TH tnameserv 1 "07 May 2011"
  23 
  24 .LP
  25 .SH "名前"
  26 Java IDL: 一時ネームサービス \- \f2tnameserv\fP
  27 .LP
  28 .LP
  29 このドキュメントでは、Java IDL 一時ネームサービス \f2tnameserv\fP の使用方法について説明します。Java IDL には、Object Request Broker Daemon (ORBD) も含まれています。ORBD は、ブートストラップサービス、一時ネームサービス、\f3持続\fPネームサービス、およびサーバーマネージャーを含むデーモンプロセスです。Java IDL のすべてのチュートリアルでは ORBD を使用していますが、一時ネームサービスを使用する例では、\f2orbd\fP の代わりに \f2tnameserv\fP を使用できます。\f2orbd\fP ツールの詳細については、orbd の orbd(1)または 
  30 .na
  31 \f2ORBD に含まれる Java IDL ネームサービス\fP @
  32 .fi
  33 http://java.sun.com/javase/6/docs/technotes/guides/idl/jidlNaming.htmlに関するトピックを参照してください。
  34 .LP
  35 .LP
  36 ここでは、以下の項目について説明します。
  37 .LP
  38 .RS 3
  39 .TP 2
  40 o
  41 Java\ IDL 一時ネームサービス 
  42 .TP 2
  43 o
  44 Java\ IDL 一時ネームサービスの起動 
  45 .TP 2
  46 o
  47 Java\ IDL 一時ネームサービスの停止 
  48 .TP 2
  49 o
  50 サンプルクライアント: 名前空間へのオブジェクトの追加 
  51 .TP 2
  52 o
  53 サンプルクライアント: 名前空間のブラウズ 
  54 .RE
  55 
  56 .LP
  57 .SH "Java IDL 一時ネームサービス"
  58 .LP
  59 .LP
  60 CORBA の COS (Common Object Services) ネームサービスは、ファイルシステムがファイルに対してディレクトリ構造を提供しているのと同じように、オブジェクト参照に対してツリー構造のディレクトリを提供します。Java IDL の一時ネームサービスである \f2tnameserv\fP は、COS ネームサービスの仕様を単純な形で実装したものです。
  61 .LP
  62 .LP
  63 オブジェクト参照は名前空間に名前で格納され、オブジェクト参照と名前のペアは、それぞれ「ネームバインディング」と呼ばれます。ネームバインディングは「ネーミングコンテキスト」に組み込むことができます。ネーミングコンテキストはそれ自体がネームバインディングであり、ファイルシステムのサブディレクトリと同じ編成機能を持ちます。すべてのバインディングは「初期ネーミングコンテキスト」に格納されます。名前空間において、初期ネーミングコンテキストは唯一の持続的バインディングです。それ以外のネーミングコンテキストは、Java IDL のネーミングサービスプロセスが停止し、再起動されると失われます。
  64 .LP
  65 .LP
  66 アプレットまたはアプリケーションから COS ネームサービスを使用するためには、その ORB はネームサービスが動作しているホストのポートを知っているか、そのネームサービスの文字列化された初期ネーミングコンテキストにアクセスできなければなりません。ネームサービスは、Java IDL のネームサービスでもその他の COS 準拠のネームサービスでもかまいません。
  67 .LP
  68 .SH "Java IDL 一時ネームサービスの起動"
  69 .LP
  70 .LP
  71 Java IDL ネームサービスは、ネームサービスを使用するアプリケーションまたはアプレットより前に起動しておく必要があります。Java\ IDL 製品をインストールすると、Java\ IDL ネームサービスを起動するスクリプト (Solaris: \f2tnameserv\fP) または実行可能ファイル (Windows NT: \f2tnameserv.exe\fP) が作成されます。バックグラウンドで動作するように、ネームサービスを起動してください。
  72 .LP
  73 .LP
  74 特に指定しない場合、Java IDL ネームサービスは、ORB の \f2resolve_initial_references()\fP メソッドと \f2list_initial_references()\fP メソッドの実装に使用するブートストラッププロトコルに対してポート 900 で待機します。
  75 .LP
  76 .nf
  77 \f3
  78 .fl
  79         tnameserv \-ORBInitialPort \fP\f4nameserverport\fP\f3&
  80 .fl
  81 \fP
  82 .fi
  83 
  84 .LP
  85 .LP
  86 ネームサーバーポートを指定しない場合、デフォルトでポート 900 が使用されます。Solaris ソフトウェアの実行時は、1024 より小さいポートでプロセスを開始する場合、root ユーザーになる必要があります。このため、1024 または 1024 よりも大きいポート番号を使用することをお勧めします。1050 のように別のポートを指定し、ネームサービスをバックグラウンドで実行するには、UNIX コマンドシェルで次のように入力します。
  87 .LP
  88 .nf
  89 \f3
  90 .fl
  91         tnameserv \-ORBInitialPort 1050&
  92 .fl
  93 \fP
  94 .fi
  95 
  96 .LP
  97 .LP
  98 Windows の MS\-DOS システムプロンプトでは、次のように入力します。
  99 .LP
 100 .nf
 101 \f3
 102 .fl
 103         start tnameserv \-ORBInitialPort 1050
 104 .fl
 105 \fP
 106 .fi
 107 
 108 .LP
 109 .LP
 110 ネームサーバーのクライアントには、新しいポート番号を知らせる必要があります。このため、ORB オブジェクトの作成時に \f2org.omg.CORBA.ORBInitialPort\fP プロパティーに新しいポート番号を設定します。
 111 .LP
 112 .SS 
 113 異なるマシン上でのクライアントとサーバーの実行
 114 .LP
 115 .LP
 116 Java IDL と RMI\-IIOP のほとんどのチュートリアルでは、ネームサービス、サーバー、およびクライアントはすべて開発用のマシン上で実行されます。実際に配備する場合には、クライアントとサーバーを、ネームサービスとは異なるホスト上で実行することが多くなります。
 117 .LP
 118 .LP
 119 クライアントとサーバーがネームサービスを見つけるには、クライアントとサーバーが、ネームサービスが実行されているポートの番号とホストを認識している必要があります。そのためには、クライアントとサーバーのファイル内の \f2org.omg.CORBA.ORBInitialPort\fP プロパティーと \f2org.omg.CORBA.ORBInitialHost\fP プロパティーをネームサービスが実行されているポートの番号とマシンの名前に設定します。この例は、
 120 .na
 121 \f2「RMI\-IIOP を使った Hello World の例」に示されています。\fP @
 122 .fi
 123 http://java.sun.com/javase/6/docs/technotes/guides/rmi\-iiop/rmiiiopexample.htmlコマンド行オプション \f2\-ORBInitialPort\fP \f2nameserverport#\fP と \f2\-ORBInitialHost\fP \f2nameserverhostname\fP を使用して、クライアントとサーバーに対してネームサービスを探す場所を指定することもできます。
 124 .na
 125 \f2「Java IDL: 2 台のマシン上で実行する Hello World プログラム」\fP @
 126 .fi
 127 http://java.sun.com/javase/6/docs/technotes/guides/idl/tutorial/jidl2machines.html には、コマンド行オプションを使用して指定する方法が示されています。
 128 .LP
 129 .LP
 130 たとえば、一時ネームサービス \f2tnameserv\fP が、ホスト \f2nameserverhost\fP のポート 1050 上で実行されているとします。さらに、クライアントがホスト \f2clienthost\fP 上で実行され、サーバーはホスト \f2serverhost\fP 上で実行されているとします。
 131 .LP
 132 .RS 3
 133 .TP 2
 134 o
 135 次のように、ホスト \f2nameserverhost\fP 上で \f2tnameserv\fP を起動します。 
 136 .nf
 137 \f3
 138 .fl
 139      tnameserv \-ORBInitialPort 1050
 140 .fl
 141 
 142 .fl
 143 \fP
 144 .fi
 145 .TP 2
 146 o
 147 \f2serverhost\fP 上でサーバーを起動します。 
 148 .nf
 149 \f3
 150 .fl
 151      java Server \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost
 152 .fl
 153 \fP
 154 .fi
 155 .TP 2
 156 o
 157 \f2clienthost\fP 上でクライアントを起動します。 
 158 .nf
 159 \f3
 160 .fl
 161      java Client \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost
 162 .fl
 163 \fP
 164 .fi
 165 .RE
 166 
 167 .LP
 168 .SS 
 169 \-J オプション
 170 .LP
 171 このコマンド行オプションは、\f2tnameserve\fP とともに使用できます。 
 172 .RS 3
 173 .TP 3
 174 \-Joption 
 175 Java 仮想マシンに \f2option\fP を渡します。\f2option\fP には、java(1)のリファレンスページに記載されているオプションを 1 つ指定します。たとえば、\f3\-J\-Xms48m\fP と指定すると、スタートアップメモリーは 48M バイトに設定されます。\f3\-J\fP を使って背後の実行環境にオプションを渡すことはよく行われています。 
 176 .RE
 177 
 178 .LP
 179 .SH "Java IDL 一時ネームサービスの停止"
 180 .LP
 181 .LP
 182 Java IDL ネームサービスを停止するには、Unix の場合は、\f2kill\fP などのオペレーティングシステムのコマンドを使い、Windows の場合は、\f2Ctrl\-C\fP を使います。ネームサービスを明示的に停止するまでは、呼び出し待機状態が続きます。なお、サービスを終了させると、Java IDL ネームサービスに登録されている名前は失われます。
 183 .LP
 184 .SH "サンプルクライアント: 名前空間へのオブジェクトの追加"
 185 .LP
 186 .LP
 187 次に示すサンプルプログラムは、名前を名前空間に追加する方法を示すものです。このサンプルプログラムは、このままの状態で完全に動作する一時ネームサービスクライアントで、次のような単純なツリーを作成するものです。
 188 .LP
 189 .nf
 190 \f3
 191 .fl
 192 \fP\f3
 193 .fl
 194                   \fP\f4初期\fP\f3
 195 .fl
 196                \fP\f4ネーミングコンテキスト\fP\f3
 197 .fl
 198                   /      \\ 
 199 .fl
 200                  /        \\ 
 201 .fl
 202               plans     \fP\f4Personal\fP\f3
 203 .fl
 204                          /   \\ 
 205 .fl
 206                         /     \\ 
 207 .fl
 208                    calendar  schedule\fP
 209 .fl
 210 .fi
 211 
 212 .LP
 213 .LP
 214 この例で、\f3plans\fP はオブジェクト参照、\f3Personal\fP は \f3calendar\fP と \f3schedule\fP の 2 つのオブジェクト参照を含むネーミングコンテキストです。
 215 .LP
 216 .nf
 217 \f3
 218 .fl
 219 import java.util.Properties;
 220 .fl
 221 import org.omg.CORBA.*;
 222 .fl
 223 import org.omg.CosNaming.*;
 224 .fl
 225 
 226 .fl
 227 public class NameClient
 228 .fl
 229 {
 230 .fl
 231    public static void main(String args[])
 232 .fl
 233    {
 234 .fl
 235       try {
 236 .fl
 237 \fP
 238 .fi
 239 
 240 .LP
 241 前述の「Java IDL 一時ネームサービスの起動」で、ネームサーバーはポート 1050 を使用して起動しました。次のコードで、このポート番号をクライアントシステムに知らせます。 
 242 .nf
 243 \f3
 244 .fl
 245         Properties props = new Properties();
 246 .fl
 247         props.put("org.omg.CORBA.ORBInitialPort", "1050");
 248 .fl
 249         ORB orb = ORB.init(args, props);
 250 .fl
 251 
 252 .fl
 253 \fP
 254 .fi
 255 
 256 .LP
 257 次のコードでは、初期ネーミングコンテキストを取得し、それを \f3ctx\fP に代入します。2 行目では、\f3ctx\fP をダミーのオブジェクト参照 \f3objref\fP にコピーします。この objref には、あとでさまざまな名前を割り当てて名前空間に追加します。 
 258 .nf
 259 \f3
 260 .fl
 261         NamingContext ctx =
 262 .fl
 263 NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
 264 .fl
 265         NamingContext objref = ctx;
 266 .fl
 267 
 268 .fl
 269 \fP
 270 .fi
 271 
 272 .LP
 273 次のコードでは、text 型の名前 plans を作成し、それをダミーのオブジェクト参照にバインドします。その後、rebind を使用して初期ネーミングコンテキストの下に \f2plans を追加しています\fP。 \f2rebind\fP メソッドを使用すれば、bind を使用した場合に発生する例外を発生させずに、 \f2このプログラムを何度も繰り返し実行できます\fP。 
 274 .nf
 275 \f3
 276 .fl
 277         NameComponent nc1 = new NameComponent("plans", "text");
 278 .fl
 279         NameComponent[] name1 = {nc1};
 280 .fl
 281         ctx.rebind(name1, objref);
 282 .fl
 283         System.out.println("plans rebind sucessful!");
 284 .fl
 285 
 286 .fl
 287 \fP
 288 .fi
 289 
 290 .LP
 291 次のコードでは、directory 型の Personal というネーミングコンテキストを作成します。その結果得られるオブジェクト参照 \f3ctx2\fP をこの名前にバインドし、初期ネーミングコンテキストに追加します。 
 292 .nf
 293 \f3
 294 .fl
 295         NameComponent nc2 = new NameComponent("Personal", "directory");
 296 .fl
 297         NameComponent[] name2 = {nc2};
 298 .fl
 299         NamingContext ctx2 = ctx.bind_new_context(name2);
 300 .fl
 301         System.out.println("new naming context added..");
 302 .fl
 303 
 304 .fl
 305 \fP
 306 .fi
 307 
 308 .LP
 309 残りのコードでは、ダミーのオブジェクト参照を schedule と calendar という名前でネーミングコンテキスト "Personal" (\f3ctx2\fP) にバインドします。 
 310 .nf
 311 \f3
 312 .fl
 313         NameComponent nc3 = new NameComponent("schedule", "text");
 314 .fl
 315         NameComponent[] name3 = {nc3};
 316 .fl
 317         ctx2.rebind(name3, objref);
 318 .fl
 319         System.out.println("schedule rebind sucessful!");
 320 .fl
 321 
 322 .fl
 323         NameComponent nc4 = new NameComponent("calender", "text");
 324 .fl
 325         NameComponent[] name4 = {nc4};
 326 .fl
 327         ctx2.rebind(name4, objref);
 328 .fl
 329         System.out.println("calender rebind sucessful!");
 330 .fl
 331 
 332 .fl
 333 
 334 .fl
 335     } catch (Exception e) {
 336 .fl
 337         e.printStackTrace(System.err);
 338 .fl
 339     }
 340 .fl
 341   }
 342 .fl
 343 }
 344 .fl
 345 \fP
 346 .fi
 347 
 348 .LP
 349 .SH "サンプルクライアント: 名前空間のブラウズ"
 350 .LP
 351 .LP
 352 次のサンプルプログラムでは、名前空間をブラウズする方法を示します。
 353 .LP
 354 .nf
 355 \f3
 356 .fl
 357 import java.util.Properties;
 358 .fl
 359 import org.omg.CORBA.*;
 360 .fl
 361 import org.omg.CosNaming.*;
 362 .fl
 363 
 364 .fl
 365 public class NameClientList
 366 .fl
 367 {
 368 .fl
 369    public static void main(String args[])
 370 .fl
 371    {
 372 .fl
 373       try {
 374 .fl
 375 \fP
 376 .fi
 377 
 378 .LP
 379 前述の「Java IDL 一時ネームサービスの起動」で、ネームサーバーはポート 1050 を使用して起動しました。次のコードで、このポート番号をクライアントシステムに知らせます。 
 380 .nf
 381 \f3
 382 .fl
 383 
 384 .fl
 385         Properties props = new Properties();
 386 .fl
 387         props.put("org.omg.CORBA.ORBInitialPort", "1050");
 388 .fl
 389         ORB orb = ORB.init(args, props);
 390 .fl
 391 
 392 .fl
 393 
 394 .fl
 395 \fP
 396 .fi
 397 
 398 .LP
 399 次のコードでは、初期ネーミングコンテキストを取得しています。 
 400 .nf
 401 \f3
 402 .fl
 403         NamingContext nc =
 404 .fl
 405 NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
 406 .fl
 407 
 408 .fl
 409 \fP
 410 .fi
 411 
 412 .LP
 413 \f2list\fP メソッドは、ネーミングコンテキストに追加されているバインディングをリストします。この場合、最大 1000 個までのバインディングが初期ネーミングコンテキストから BindingListHolder に返されます。残りのバインディングは、BindingIteratorHolder に返されます。 
 414 .nf
 415 \f3
 416 .fl
 417         BindingListHolder bl = new BindingListHolder();
 418 .fl
 419         BindingIteratorHolder blIt= new BindingIteratorHolder();
 420 .fl
 421         nc.list(1000, bl, blIt);
 422 .fl
 423 
 424 .fl
 425 \fP
 426 .fi
 427 
 428 .LP
 429 次のコードでは、返された BindingListHolder からバインディングの配列を取得します。バインディングがない場合は、プログラムは終了します。 
 430 .nf
 431 \f3
 432 .fl
 433         Binding bindings[] = bl.value;
 434 .fl
 435         if (bindings.length == 0) return;
 436 .fl
 437 
 438 .fl
 439 \fP
 440 .fi
 441 
 442 .LP
 443 残りのコードでは、バインディングに対してループ処理を行い、名前を出力します。 
 444 .nf
 445 \f3
 446 .fl
 447         for (int i=0; i < bindings.length; i++) {
 448 .fl
 449 
 450 .fl
 451             // get the object reference for each binding
 452 .fl
 453             org.omg.CORBA.Object obj = nc.resolve(bindings[i].binding_name);
 454 .fl
 455             String objStr = orb.object_to_string(obj);
 456 .fl
 457             int lastIx = bindings[i].binding_name.length\-1;
 458 .fl
 459 
 460 .fl
 461             // check to see if this is a naming context
 462 .fl
 463             if (bindings[i].binding_type == BindingType.ncontext) {
 464 .fl
 465               System.out.println( "Context: " +
 466 .fl
 467 bindings[i].binding_name[lastIx].id);
 468 .fl
 469             } else {
 470 .fl
 471                 System.out.println("Object: " +
 472 .fl
 473 bindings[i].binding_name[lastIx].id);
 474 .fl
 475             }
 476 .fl
 477         }
 478 .fl
 479 
 480 .fl
 481        } catch (Exception e) {
 482 .fl
 483         e.printStackTrace(System.err);
 484 .fl
 485        }
 486 .fl
 487    }
 488 .fl
 489 }
 490 .fl
 491 \fP
 492 .fi
 493 
 494 .LP
 495