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