レッスン 5: 文字列化されたオブジェクト参照の使用


クライアントアプリケーションが CORBA オブジェクト上のオペレーションを呼び出すには、そのオブジェクトへの参照が必要です。この参照はさまざまな方法で取得できます。たとえば、ORB.resolve_initial_references() を呼び出す方法や、ネームサービス等の別の CORBA オブジェクトを使う方法があります。ここまでのレッスンでは、この両方の方法を使って初期オブジェクト参照を取得しました。

しかし、分散環境で利用できるネームサービスがないことがよくあります。 この場合は、CORBA クライアントは「文字列化された」オブジェクト参照を使って最初のオブジェクトを検索します。

このレッスンでは、 サーバの起動手順の一部として文字列化されたオブジェクト参照を作成する方法、およびクライアントが参照を取得して実際のオブジェクト参照として使うために文字列化を解除する方法を学びます。

このレッスンの手順は次のとおりです。

  1. 文字列化されたオブジェクト参照の作成
  2. 文字列化されたオブジェクト参照の取得
  3. オブジェクト参照の文字列化解除
  4. 文字列化版 Hello World のコンパイルと実行

完成したソースコードを見るには、HelloServer.javaHelloClient.java をクリックしてください。

文字列化されたオブジェクト参照の作成

オブジェクト参照をクライアントから利用できるようにするには、サーバがその参照を作成して、クライアントからアクセスできる場所に保存する必要があります。このレッスンでは、参照をテキストファイルの形式で作成してディスクに保存します。
  1. 前のレッスンで作成した HelloServer.java ファイルをコピーします ([Path_to_JDK]/docs/guide/idl/tutorial/server からコピーしてもかまいません)。

  2. このレッスンでは、サーバがファイルをディスクに書き込むので、import 文を追加する必要があります。次のコードを追加します。
    import java.io.*; // needed for output to the file system.
    
  3. このレッスンでは、サーバはネームサービスを利用しないので、CosNaming パッケージは必要ありません。次の 2 行を削除します。
    import org.omg.CosNaming.*;                       // not needed for stringified version
    import org.omg.CosNaming.NamingContextPackage.*;  // remove from code
    
  4. 初期ネーミングコンテキストを取得する部分と Hello オブジェクトへの参照を解釈処理する部分を削除します。
          // Get the root naming context
          org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
          NamingContext ncRef = NamingContextHelper.narrow(objRef);
          
          // Bind the object reference in naming
          NameComponent nc = new NameComponent("Hello", " ");
          NameComponent path[] = {nc};
          ncRef.rebind(path, helloRef);
    
  5. ORB の object_to_string() メソッドを呼び出して、サーバントオブジェクトへの参照に渡します。その結果、ディスク上のファイルへの保存が可能な文字列の形でオブジェクト参照が返されます。
          String ior = orb.object_to_string(helloRef);
    
  6. 保存するファイルへのパスを作成します。システムプロパティを使ってパスの構造と構文を決定します。
          String filename = System.getProperty("user.home")+
                System.getProperty("file.separator")+"HelloIOR";
    
  7. 標準の Java オペレーションを使って、文字列化された ior をディスクに書き込みます。
          FileOutputStream fos = new FileOutputStream(filename);
          PrintStream ps = new PrintStream(fos);
          ps.print(ior);
          ps.close();
    
HelloServer は実行時に ORB を呼び出してサーバントオブジェクトをネーミングに登録する代わりに、サーバントへの文字列化された参照を含むテキストファイル HelloIOR を作成します。ファイルはホームディレクトリに保存されます。

文字列化されたオブジェクト参照の取得

Windows ユーザの方は、このマニュアルのパスのスラッシュ (/) をバックスラッシュ (\) に置き換えてください。

  1. 前のレッスンで作成した HelloClient.java ファイルをコピーします ([Path_to_JDK]/docs/guide/idl/tutorial/app からコピーしてもかまいません)。

  2. このレッスンでは、クライアントがディスクからファイルを読み込むので、import 文を変更します。次のコードを追加します。
    import java.io.*; // needed for input from the file system.
    
  3. このレッスンでは、クライアントはネームサービスを利用しないので、CosNaming パッケージは必要ありません。次の行を削除します。
    import org.omg.CosNaming;*  // not needed for stringified version
    
  4. ネーミングコンテキストを取得する部分とネームサービスにサーバントを登録する次の部分を削除します。
          // Get the root naming context
          org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
          NamingContext ncRef = NamingContextHelper.narrow(objRef);
          
          // Resolve the object reference in naming
          NameComponent nc = new NameComponent("Hello", " ");
          NameComponent path[] = {nc};
          Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
    
  5. 標準の Java オペレーションを使って、オブジェクト参照が記述されたファイルを読み込みます。ファイルの名前と保存場所は、クライアントとサーバの両方が知っている必要があります。
          String filename = System.getProperty("user.home")+
                System.getProperty("file.separator")+"HelloIOR";
          FileInputStream fis = new FileInputStream(filename);
          DataInputStream dis = new DataInputStream(fis);
          String ior = dis.readLine();
    

これで、HelloClient アプリケーションは、文字列化されたオブジェクト参照の入っている String オブジェクトを取得しました。

オブジェクト参照の文字列化解除

ior 内のオブジェクト参照を文字列化解除するには、標準 ORB メソッドを呼び出します。

      org.omg.CORBA.Object obj = orb.string_to_object(ior);

最後に、CORBA オブジェクトを適切な型にナロー変換して、クライアントから呼び出せるようにします。

      Hello helloRef = HelloHelper.narrow(obj);
これ以外のクライアントコードは、前のレッスンと同じなので変更しません。

文字列化版 Hello World のコンパイルと実行

文字列化版の Hello World をコンパイルして実行する手順は、ネームサービス版とほとんど同じです。

Hello World の設定

  1. String という名前のプロジェクトディレクトリを新規に作成します。

  2. 文字列化版の HelloServer.javaHelloClient.javaString ディレクトリにコピーします。

  3. [Path_to_JDK]/docs/guide/idl/tutorial/string/helloApp ディレクトリとその内容全体を String ディレクトリにコピーします。

プロジェクトディレクトリは次のようになります。

string
 |-HelloServer.java
 |-HelloClient.java
 |-HelloApp
    |-_HelloImplBase.class
    |-_HelloStub.class
    |-Hello.class
    |-HelloHelper.class
    |-HelloHolder.class

Hello World のコンパイル

  1. 作成した String ディレクトリに移動します。

  2. 作成したソースコードに対して Java コンパイラを実行します。
    javac *.java
    
  3. ファイルにエラーがあれば、修正してコンパイルし直します (正確に入力するのが難しい場合は、[Path_to_JDK]/docs/guide/idl/tutorial/string ディレクトリからファイルをコピーして使ってもかまいません)。

  4. String ディレクトリに、HelloServer.classHelloServant.classHelloClient.class ができたことを確認します。

Hello World の実行

このレッスンで作ったサーバプログラムが確実に実行されるよう、前のレッスンで実行した Hello サーバとネームサーバのすべてのプロセスが停止していることを確認します。

  1. Hello サーバを起動します。
    java HelloServer -ORBInitialPort 1050 &
  2. 別のウィンドウから Hello クライアントアプリケーションを実行します。

    java HelloClient -ORBInitialPort 1050

    コマンド行に、次の文字列が表示されます。

    Hello world!!

詳細情報

初期化: 初期オブジェクト参照の取得
初期オブジェクト参照を取得するさまざまな方法の説明


前のレッスン | チュートリアルのホーム | HelloClient.java | HelloServer.java
ホーム

Copyright © 1996, 1997 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA. 94043-1100 USA., All rights reserved.