レッスン 2:クライアントアプリケーションの開発


レッスンの概要

このレッスンでは、CORBA クライアントアプリケーション作成の基本を学びます。このレッスンでは次のことを行います。

  1. 基本設定
  2. ORB オブジェクトの作成
  3. Hello サーバの検索
  4. sayHello() オペレーションの呼び出し
  5. Hello World アプレットのコンパイルと実行

完成した HelloClient.java ファイルを見るには、HelloClient.java をクリックしてください。

基本設定

CORBA クライアントの構造は、多くの Java アプリケーションと同じです。つまり、必要なライブラリパッケージをインポートし、アプリケーションクラスを宣言し、main() メソッドを定義し、例外の処理を行います。

必要なパッケージのインポート

テキストエディタを起動して、HelloClient.java という名前の新しいファイルをプロジェクトディレクトリに保存します。

クライアントクラスに必要なパッケージをインポートします。

import HelloApp.*;           // The package containing our stubs.
import org.omg.CosNaming.*;  // HelloClient will use the naming service.
import org.omg.CORBA.*;      // All CORBA applications need these classes.

クライアントクラスの宣言

HelloClient.java で、クライアントクラスを宣言します。

public class HelloClient
{
  // Add the main() method here in the next step.
}

main() メソッドの定義

すべての Java アプリケーションには main() メソッドが必要です。このメソッドを次のように、HelloClient クラスのスコープ内で宣言します。

  public static void main(String args[])
  {
    // Put the try-catch block here in the next step.
  }

CORBA システム例外の処理

どの CORBA プログラムでも、実行時に CORBA システム例外が発生する可能性があるので、main() メソッドの機能は、すべて try-catch ブロック内に記述します。CORBA プログラムは、呼び出しに伴うプロセス (整列化、非整列化、アップコール) で問題が発生すると、システム例外を発生させます。

このレッスンの例外ハンドラは簡単なもので、どんな問題が起こったかが分かるように、例外の名前とスタックのトレースを標準出力に表示します。

main() の中に、以下の try-catch ブロックを記述します。

    try{
    
      // Add the rest of the HelloClient code here.
    
    } catch(Exception e) {
        System.out.println("ERROR : " + e);
        e.printStackTrace(System.out);
      }

ファイルを保存します。

ORB オブジェクトの作成

整列化と IIOP の作業をすべて行うために、CORBA クライアントはローカルの ORB オブジェクトを必要とします。各クライアントは、org.omg.CORBA.ORB オブジェクトのインスタンスを生成してから、そのオブジェクト自体に関する特定の情報を渡すことにより、そのオブジェクトを初期化します。

HelloClient.java が閉じているときは、ここで開いてください。

try-catch ブロックの中で、ORB 変数を宣言して初期化します。

      ORB orb = ORB.init(args, null);

ORB の init() メソッドの呼び出しはアプリケーションのコマンド行引数に渡されるので、実行時に特定のプロパティを設定できます。

ここで必ずファイルを保存してください。

Hello サーバの検索

これでアプリケーションに ORB が備わったので、アプリケーションは必要な実際のサービスの検索を ORB に要請できます。 CORBA クライアントが初期オブジェクト参照を得る方法は数多くありますが、このレッスンのクライアントアプリケーションでは、OMG により指定され、Java IDL で利用可能な COS ネームサービスを利用します。利用可能なネームサービスがないときに初期オブジェクト参照を得る方法については、レッスン 5 を参照してください。

初期ネーミングコンテキストの取得

ネームサービスを利用するための最初のステップは、初期ネーミングコンテキストの取得です。try-catch ブロックの中で、ORB の初期化の次に、orb.resolve_initial_references() を呼び出してネームサーバへのオブジェクト参照を取得します。

      org.omg.CORBA.Object objRef = 
            orb.resolve_initial_references("NameService");

文字列 NameService は、すべての CORBA ORB に対して定義されています。この文字列を渡すと、ORB から初期ネーミングコンテキストが返されます。 初期ネーミングコンテキストは、ネームサービスへのオブジェクト参照です。

オブジェクト参照のナロー変換

CORBA のどのオブジェクト参照とも同様に、objRef は汎用の CORBA オブジェクトです。これを NamingContext オブジェクトとして使うには、適切な型にナロー変換する必要があります。前の文の直後に narrow() の呼び出しを追加します。

      NamingContext ncRef = NamingContextHelper.narrow(objRef);

これは、idltojava から生成されるヘルパークラスの使用方法です。このクラスの機能は HelloHelper の機能に類似しています。ここで ncRef オブジェクトは org.omg.CosNaming.NamingContext になったので、これを使ってネームサービスにアクセスし、ほかのサービスを検索することができます。次のステップで、その処理を行います。

ネーミング内のサービスの検索

名前の構造は、ネームサービスの実装の方法によって異なります。そのため CORBA ネームサーバでは、NameComponent オブジェクトを利用して複雑な名前を取り扱います。1 つの NameComponent には、名前の一部分 (要素) が入ります。NameComponent オブジェクトの配列によって、1 つのコンピュータファイルやディスクシステムのオブジェクトへの完全なパスを指定できます。

Hello サーバを検索するには、まず Hello サーバを識別する文字列を格納するための NameComponent が必要です。HelloClient.java が閉じているときは、ここで開いてください。narrow() の呼び出しの直後に、次のコードを追加します。

      NameComponent nc = new NameComponent("Hello", "");

この文は、ncid フィールドに 「Hello」を設定し、kind フィールドに空白文字列を設定します。

Hello オブジェクトへのパスには要素が 1 つしかないので、nc から単一要素の配列を作成します。NamingContext.resolve() メソッドには、作業用に配列が必要です。

      NameComponent path[] = {nc};

最後に、ネームサービスの resolve() メソッドに path を渡して Hello サーバへのオブジェクト参照を取得し、その参照を Hello オブジェクトにナロー変換します。

      Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));

ここで、HelloHelper ヘルパークラスが機能します。上に示したように、ネームサービスの検出時に resolve() メソッドは、一般的な CORBA オブジェクトを返します。このため、即座に Hello オブジェクトにナロー変換することができます。 このオブジェクトは、残りの作業を実行するのに必要なオブジェクト参照です。

HelloClient.java ファイルを保存します。

sayHello() オペレーションの呼び出し

CORBA の呼び出しは、ローカルオブジェクトでのメソッドの呼び出しに似ています。回線へのパラメータの整列化、サーバ側 ORB へのルーティング、非整列化、サーバメソッドへのアップコールの配置などの複雑な状況を、クライアント側のプログラマは透過的に把握できます。コンパイラの生成したコードがプログラマに代わってさまざまな作業を行うので、CORBA では呼び出しのプログラミングは簡単です。

  1. HelloClient.java が閉じている場合は、開きます。

  2. try-catch ブロックの中で、ネームサーバのresolve() メソッドの呼び出しの直後に、次の呼び出しを記述します。
          String Hello = helloRef.sayHello();
    
  3. 最後に、呼び出しの結果を標準出力に表示します。
          System.out.println(Hello);
    
  4. HelloClient.java を保存して閉じます。

Hello World アプレットのコンパイルと実行

HelloClient を実行するには、いくつかのサーバファイルを新規に作成する必要があります。これらのファイルは、[Path_to_JDK]/docs/guide/idl/tutorial/app にあります。必要に応じてコピーして、プロジェクトディレクトリを作成します。

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

アプリケーションの設定

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

  2. HelloClient.java ファイルを Application ディレクトリにコピーします。

  3. HelloServer.classHelloServant.class[Path_to_JDK]/docs/guide/idl/tutorial/app から Application ディレクトリにコピーします。

  4. [Path_to_JDK]/docs/guide/idl/tutorial/app/HelloApp ディレクトリとその内容全体を、Application ディレクトリにコピーします。

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

アプリケーション
 |-HelloClient.java
 |-HelloServant.class
 |-HelloServer.class
 |-HelloApp
    |-_HelloImplBase.class
    |-_HelloStub.class
    |-Hello.class
    |-HelloHelper.class
    |-HelloHolder.class

クライアントアプリケーションのコンパイル

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

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

  4. Application ディレクトリに HelloClient.class ができます。

クライアントアプリケーションの実行

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

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

    Hello world!!

次のレッスンに進む前に、必ず両方のサーバプロセスを停止させてください。

トラブルシューティング

ORB 初期ポートの指定

デフォルトの ORB 初期ポート番号は、900 です。ネームサーバをポート番号 900 で起動する場合は、ポートの指定を省略することもできます。Solaris を使う場合は、1024 未満のポート番号でプロセスを起動するために、root としてアクセスする必要があります。ネームサーバにこのポートを選んだ場合は、必ず root 権限によるアクセスを終了してから、レッスンを続けてください。

詳細情報

クライアントの開発
CORBA クライアントのプログラミングに関する問題
例外:システム例外
CORBA のシステム例外の動作と、Java IDL のシステム例外のマイナーコードの詳細な説明
初期化: システムプロパティ
初期化時に ORB に引き渡し可能なプロパティの種類についての説明
ネームサービス
COS ネームサービスの詳細な説明


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


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