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