このトピックでは、CORBA クライアント・アプリケーション作成の基本を学びます。このレッスンでは次のことを行います。
HelloClient.javaを作成するには、次のようにします。
HelloClient.java
// Copyright and License import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; public class HelloClient { static Hello helloImpl; public static void main(String args[]) { try{ // create and initialize the ORB ORB orb = ORB.init(args, null); // get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt instead of NamingContext. This is // part of the Interoperable naming Service. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // resolve the Object Reference in Naming String name = "Hello"; helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println("Obtained a handle on server object: " + helloImpl); System.out.println(helloImpl.sayHello()); helloImpl.shutdown(); } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } }
ここでは、HelloClient.javaの各行について、そのコードが何をしているか、またアプリケーションでなぜ必要なのかということを説明します。
CORBAクライアントの構造は、多くのJavaアプリケーションと同じです。つまり、必要なライブラリ・パッケージをインポートし、アプリケーション・クラスを宣言し、mainメソッドを定義し、そして例外の処理を行います。
まず、クライアント・クラスに必要なパッケージをインポートします。
import HelloApp.*; // the package containing our stubs import org.omg.CosNaming.*; // HelloClient will use the Naming Service import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; // All CORBA applications need these classes
次に、クライアント・クラスを宣言します。
public class HelloClient { // The main() method goes here. }
すべてのJavaアプリケーションにはmain()メソッドが必要です。このメソッドを次のように、HelloClientクラスのスコープ内で宣言します。
public static void main(String args[]) { // The try-catch block goes here. }
どの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); }
整列化とIIOPの作業をすべて行うために、CORBAクライアントはローカルのORBオブジェクトを必要とします。各クライアントは、org.omg.CORBA.ORBオブジェクトのインスタンスを生成してから、そのオブジェクト自体に関する特定の情報を渡すことにより、そのオブジェクトを初期化します。
try-catchブロックの中で、ORB変数を宣言して初期化します。
ORB orb = ORB.init(args, null);
ORBのinit()メソッドの呼出しはアプリケーションのコマンド行引数に渡されるので、実行時に特定のプロパティを設定できます。
これでアプリケーションにORBが備わったので、アプリケーションは必要な実際のサービスの検索をORBに要請できます。このレッスンでは、このサービスはHelloサーバーです。CORBAクライアントが初期オブジェクト参照を得る方法は数多くありますが、このレッスンのクライアント・アプリケーションでは、OMGにより指定され、Java IDLで利用可能なCOSネーム・サービスを利用します。利用可能なネーム・サービスがないときに初期オブジェクト参照を得る方法については、「文字列化されたオブジェクト参照の使用」を参照してください。
ネーム・サービスには2つのオプションがあります。ブートストラップ・サービス、一時ネーム・サービス、持続ネーム・サービス、サーバー・マネージャを含むデーモン・プロセスであるorbd (Solaris、Linux、Mac OS XまたはWindows)および一時ネーム・サービスであるtnameservです。この例ではorbdを使用しています。
ネーム・サービスを利用するための最初のステップは、初期ネーミング・コンテキストの取得です。try-catchブロックの中で、ORBの初期化の次に、orb.resolve_initial_references()を呼び出してネーム・サーバーへのオブジェクト参照を取得します。
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
文字列「NameService」は、すべてのCORBA ORBに対して定義されています。この文字列を渡すと、ORBから初期ネーミング・コンテキストが返されます。初期ネーミング・コンテキストは、ネーム・サービスへのオブジェクト参照です。文字列NameServiceは、次のことを示しています。
文字列NameServiceは、ネーム・サービスとしてORBDを使用するときに、一時ネーム・サービスが使用されることを示しています。この例では、orbdの一部である持続ネーム・サービスを使用しています。
CORBAのすべてのオブジェクト参照と同様に、objRefはジェネリックCORBAオブジェクトです。これをNamingContextExtオブジェクトとして使うには、適切な型にナロー変換する必要があります。
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
これは、idljにより生成されるヘルパー・クラスの使用方法です。このクラスの機能はHelloHelperの機能に類似しています。ここでncRefオブジェクトはorg.omg.CosNaming.NamingContextExtになったので、これを使用してネーム・サービスにアクセスし、他のサービスを検索できます。次のステップで、その処理を行います。
NamingContextExtオブジェクトはJ2SE v.1.4で新たに追加されたもので、Interoperable Naming Serviceの一部です。
Helloインタフェースを実装しているHelloオブジェクトに対してネーム・サービスでの参照を発行するには、まず、Helloオブジェクトの文字列を識別する必要があります。
String name = "Hello";
最後に、ネーム・サービスのresolve_str()メソッドにnameを渡してHelloサーバーへのオブジェクト参照を取得し、その参照をHelloオブジェクトにナロー変換します。
helloImpl = HelloHelper.narrow(ncRef.resolve-str(name)); System.out.println("Obtained a handle on server object: " + helloImpl);
ここで、HelloHelperヘルパー・クラスが機能します。上に示したように、ネーム・サービスの検出時にresolve-str()メソッドは、ジェネリックCORBAオブジェクトを返します。このため、即座にHelloオブジェクトにナロー変換することができます。このオブジェクトは、残りの作業を実行するのに必要なオブジェクト参照です。次に、オブジェクト参照を取得したことを確認するメッセージを画面に送ります。
CORBAの呼出しは、ローカル・オブジェクトでのメソッドの呼出しに似ています。回線へのパラメータの整列化、サーバー側ORBへのルーティング、非整列化、サーバー・メソッドへのアップ・コールの配置などの複雑な状況を、クライアント側のプログラマは透過的に把握できます。コンパイラの生成したコードがプログラマに代わってさまざまな作業を行うので、CORBAでは呼出しのプログラミングは簡単です。
最後に、呼出しの結果を標準出力に表示し、ORBを明示的にシャットダウンします。
System.out.println(helloImpl.sayHello()); helloImpl.shutdown();
ここでHelloClient.javaをコンパイルし、エラーを修正してからレッスンを続けます。
Windowsのユーザーの方は、このマニュアルのパスのスラッシュ(/)をバックスラッシュ(\)に置き換えてください。
HelloClient.javaをコンパイルするには、次のようにします。
javac HelloClient.java HelloApp/*.java