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