このレッスンでは、CORBA クライアントアプリケーション作成の基本を学びます。このレッスンでは次のことを行います。
完成した 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. }
すべての Java アプリケーションには main() メソッドが必要です。このメソッドを次のように、HelloClient クラスのスコープ内で宣言します。
public static void main(String args[]) { // Put the try-catch block here in the next step. }
どの 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", "");
この文は、nc の id フィールドに 「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 では呼び出しのプログラミングは簡単です。
String Hello = helloRef.sayHello();
System.out.println(Hello);
HelloClient を実行するには、いくつかのサーバファイルを新規に作成する必要があります。これらのファイルは、[Path_to_JDK]/docs/guide/idl/tutorial/app にあります。必要に応じてコピーして、プロジェクトディレクトリを作成します。
Windows のユーザの方は、このマニュアルのパスのスラッシュ (/) をバックスラッシュ (\) に置き換えてください。
アプリケーションの設定
プロジェクトディレクトリは次のようになります。
アプリケーション |-HelloClient.java |-HelloServant.class |-HelloServer.class |-HelloApp |-_HelloImplBase.class |-_HelloStub.class |-Hello.class |-HelloHelper.class |-HelloHolder.class
javac HelloClient.java
tnameserv -ORBInitialPort 1050 &
java HelloServer -ORBInitialPort 1050 &
java HelloClient -ORBInitialPort 1050
コマンド行に、次の文字列が表示されます。
Hello world!!
次のレッスンに進む前に、必ず両方のサーバプロセスを停止させてください。
トラブルシューティング
ORB 初期ポートの指定
デフォルトの ORB 初期ポート番号は、900 です。ネームサーバをポート番号 900 で起動する場合は、ポートの指定を省略することもできます。Solaris を使う場合は、1024 未満のポート番号でプロセスを起動するために、root としてアクセスする必要があります。ネームサーバにこのポートを選んだ場合は、必ず root 権限によるアクセスを終了してから、レッスンを続けてください。
詳細情報
前のレッスン | 次のレッスン | チュートリアルのホーム | HelloClient.java
ホーム |