Java IDL入門: クライアント・アプリケーションの開発

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

  1. HelloClient.javaの作成
  2. HelloClient.javaの理解
  3. HelloClient.javaのコンパイル

HelloClient.javaの作成

HelloClient.javaを作成するには、次のようにします。

  1. テキスト・エディタを起動して、HelloClient.javaという名前のファイルをメイン・プロジェクト・ディレクトリのHelloに作成します。
  2. HelloClient.javaの次のコードをテキスト・ファイルに記述します。コードの各行の詳細は、次の「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);
              }
        }
    
    }
     
    
  3. HelloClient.javaを保存して閉じます。

HelloClient.javaの理解

ここでは、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.
}

main()メソッドの定義

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

  public static void main(String args[])
  {
    // The try-catch block goes here.
  }

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オブジェクトのインスタンスを生成してから、そのオブジェクト自体に関する特定の情報を渡すことにより、そのオブジェクトを初期化します。

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

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

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

Helloサーバーの検索

これでアプリケーションに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オブジェクトにナロー変換することができます。このオブジェクトは、残りの作業を実行するのに必要なオブジェクト参照です。次に、オブジェクト参照を取得したことを確認するメッセージを画面に送ります。

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

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

最後に、呼出しの結果を標準出力に表示し、ORBを明示的にシャットダウンします。

        System.out.println(helloImpl.sayHello());
        helloImpl.shutdown();

HelloClient.javaのコンパイル

ここでHelloClient.javaをコンパイルし、エラーを修正してからレッスンを続けます。

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

HelloClient.javaをコンパイルするには、次のようにします。

  1. Helloディレクトリに変更します。
  2. HelloClient.javaに対してJavaコンパイラを実行します。
    javac HelloClient.java HelloApp/*.java
    
  3. ファイルにエラーがあれば、修正してコンパイルし直します。
  4. HelloClient.classHelloディレクトリに生成されます。

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

Hello Worldアプリケーションの実行については、「Hello Worldアプリケーションの実行」に記載されています。

詳細情報

クライアントの開発
CORBAクライアントのプログラミングに関する問題
例外: システム例外
CORBAシステム例外の動作の説明と、Java IDLのシステム例外のマイナー・コードの詳細
ネーム・サービス
COSネーム・サービスの詳細な説明

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.