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