ナビゲーションをスキップ

スタンドアロン クライアント プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

CORBA/IDL クライアントの開発

CORBA/IDL クライアントを使用した RMI over IIOP (CORBA/IDL クライアント使用型 RMI over IIOP) には、ORB (Object Request Broker) と共に、IDL と呼ばれる相互運用のための言語を作成するコンパイラが必要になります。ORB で IDL にコンパイル可能な言語の例としては、C、C++、COBOL などがあります。CORBA のプログラマは、CORBA インタフェース定義言語 (Interface Definition Language : IDL) のインタフェースを使用して、CORBA オブジェクトの定義、実装、および Java プログラミング言語からのアクセスが可能です。以降の節では、さまざまな分散アプリケーションで使用するクライアントの開発方法について説明します。

 


CORBA/IDL クライアント開発のガイドライン

CORBA/IDL クライアント使用型 RMI-IIOP を用いると、Java 以外のクライアントと Java オブジェクトとを相互運用できます。CORBA アプリケーションが既に存在する場合には、CORBA/IDL クライアント使用型 RMI-IIOP モデルでプログラムを作成する必要があります。基本的に、IDL インタフェースは Java から生成します。クライアント コードと WebLogic Server との通信は、これらの IDL インタフェースを介して行われます。これが基本的な CORBA プログラミングです。

以下の節では、CORBA/IDL クライアント使用型 RMI-IIOP アプリケーションを開発するためのガイドラインを示します。

詳細については、Object Management Group (OMG) による以下の仕様を参照してください。

CORBA/IDL クライアントで作業する

CORBA では、リモート オブジェクトへのインタフェースは、プラットフォームに依存しないインタフェース定義言語 (IDL) で記述されます。IDL を特定の言語にマップするには、IDL コンパイラで IDL をコンパイルします。IDL コンパイラによって、スタブやスケルトンといった多くのクラスが生成されます。これらのクラスは、クライアントやサーバで、リモート オブジェクトへの参照の取得、リクエストの転送、および受信した呼び出しのマーシャリングに使用されます。IDL クライアントを使用する場合でも、以降の各節で示すように、まず Java リモート インタフェースおよび実装クラスの作成からプログラミングを始めて、その後で IDL を生成し、WebLogic クライアントおよび CORBA クライアントとの相互運用性を実現することを強くお勧めします。IDL でコードを記述した後で、その逆マッピングによって Java コードを作成することもできますが、その方法は難しく、バグも多数発生するのでお勧めしません。

IDL と RMI-IIOP モデルの関係を以下の図に示します。

図 8-1 IDL クライアント (CORBA オブジェクト) の関係

IDL クライアント (CORBA オブジェクト) の関係


 

Java-to-IDL マッピング

WebLogic RMI では、リモート オブジェクトへのインタフェースは、java.rmi.Remote を拡張した Java リモート インタフェースに記述されます。Java-to-IDL マッピング仕様では、IDL が Java リモート インタフェースからどのように作成されるのかを定義しています。WebLogic RMI over IIOP 実装では、-idl オプションを付けて WebLogic RMI コンパイラまたは WebLogic EJB コンパイラで実装クラスを実行します。このプロセスによって、リモート インタフェースの IDL 相当部分が作成されます。その後、この IDL を IDL コンパイラでコンパイルして、CORBA クライアントに必要なクラスを生成します。

クライアントでは、リモート オブジェクトへの参照を取得し、スタブを介してメソッド呼び出しを転送します。WebLogic Server には、着信した IIOP リクエストを解析し RMI 実行時環境に直接ディスパッチする CosNaming サービスが実装されています。

このプロセスを以下の図に示します。

図 8-2 WebLogic RMI over IIOP オブジェクトの関係

WebLogic RMI over IIOP オブジェクトの関係


 

Objects-by-Value

Objects-by-Value 仕様により、2 つのプログラミング言語間で複合データ型をやり取りできるようになります。IDL クライアントで Objects-by-Value をサポートするには、Objects-by-Value をサポートする ORB (Object Request Broker) と組み合わせてそのクライアントを開発する必要があります。現在のところ、Objects-by-Value を正確にサポートしている ORB は比較的少数です。

IDL を使用する RMI over IIOP アプリケーションを開発する際には、IDL クライアントで Objects-by-Value をサポートするかどうかを検討し、それに応じて RMI インタフェースを設計します。クライアント ORB で Objects-by-Value がサポートされない場合、RMI インタフェースを制限して、他のインタフェースか CORBA プリミティブ データ型のみを渡すようにする必要があります。Objects-by-Value のサポート状況に関して BEA Systems で検証した ORB とその結果を以下の一覧表に示します。

表 8-2 主な ORB とその Objects-by-Value のサポート状況

ベンダ

バージョン

Objects-by-Value

BEA

Tuxedo 8.x C++ クライアント ORB

サポートしている

Borland

VisiBroker 3.3、3.4

サポートされていない

Borland

VisiBroker 4.x、5.x

サポートしている

Iona

Orbix 2000

サポートしている (ただし、この実装ではいくつかの問題が認識されている)

Objects-by-Value の詳細については、『WebLogic RMI プログラマーズ ガイド』の「オブジェクトの値渡しに関する制約」を参照してください。

 


CORBA/IDL クライアントの開発手順

CORBA/IDL を使用した RMI over IIOP アプリケーションを開発するには、以下の手順に従います。

  1. J2SE クライアントの開発」の手順 1 ~ 3 を実行します。
  2. -idl オプションを使用して WebLogic RMI コンパイラまたは WebLogic EJB コンパイラを実行し、IDL ファイルを生成します。
  3. IDL ファイルをコンパイルすると、必要なスタブ クラスが生成されます。これらのコンパイラの概要については、「WebLogic RMI について」および『WebLogic エンタープライズ JavaBean プログラマーズ ガイド』を参照してください。また、「Java Language Mapping to OMG IDL Specification」で Java IDL 仕様についても参照してください。

    以下のコンパイラ オプションは、RMI over IIOP に固有のものです。

    オプション

    機能

    -idl

    コンパイルされている実装クラスのリモート インタフェース用の IDL を作成する。

    -idlDirectory

    生成された IDL の保存先ディレクトリを指定する。

    -idlFactories

    valuetype のファクトリ メソッドを生成する。クライアント ORB で factory valuetype がサポートされていない場合に役立つ。

    -idlNoValueTypes

    値タイプに応じた IDL が生成されないようにする。

    -idlOverwrite

    同名の IDL ファイルが存在する場合には、コンパイラにより上書きされる。

    -idlStrict

    Objects-By-Value 仕様に厳密に準拠した IDL を生成する (appc では使用できない)。

    -idlVerbose

    IDL 生成についての詳細な情報を表示する。

    -idlVisibroker

    VisiBroker 4.1 C++ とある程度の互換性がある IDL を生成する。


     

    オプションの適用例を、次の RMI コンパイラの実行例で示します。

      > java weblogic.rmic -idl -idlDirectory /IDL rmi_iiop.HelloImpl

    このコンパイラでは、実装クラスのパッケージに従って、IDL ファイルを、idlDirectoy のサブディレクトリ内に生成します。たとえば、上記のコマンドの場合には、Hello.idl ファイルが /IDL/rmi_iiop ディレクトリに生成されます。idlDirectory オプションが使用されない場合には、IDL ファイルは、スタブ クラスやスケルトン クラスの生成先からの相対パスに生成されます。

  4. IDL ファイルをコンパイルして、IDL クライアントでリモート クラスと通信するのに必要なスタブ クラスを作成します。IDL コンパイラは ORB ベンダにより提供されています。
  5. WebLogic コンパイラで生成された IDL ファイルには、#include orb.idl ディレクティブが含まれています。この IDL ファイルは各 ORB ベンダから提供されます。orb.idl ファイルは、WebLogic 配布キットの \lib ディレクトリにあります。このファイルは、WebLogic Server に付属の JDK に含まれている ORB で使用するためだけに用意されているものです。

  6. IDL クライアントを開発します。
  7. IDL クライアントは、純粋な CORBA クライアントで、WebLogic クラスはまったく必要としません。ORB ベンダによっては、リモート クラスへの参照を解決し、ナロー変換して、取得するためのクラス群が生成されることもあります。以下の VisiBroker 4.1 ORB 向けに開発されたクライアントの例では、クライアントでネーミング コンテキストが初期化され、リモート オブジェクトへの参照が取得されて、そのリモート オブジェクトに対するメソッドが呼び出されます。

    RMI-IIOP サンプルの C++ クライアントからの抜粋コード

    // 文字列をオブジェクトに変換
    CORBA::Object_ptr o;
    cout << "Getting name service reference" << endl;
    if (argc >= 2 && strncmp (argv[1], "IOR", 3) == 0)
      o = orb->string_to_object(argv[1]);
    else
      o = orb->resolve_initial_references("NameService");
    // ネーミング コンテキストを取得
    cout << "Narrowing to a naming context" << endl;
    CosNaming::NamingContext_var context = CosNaming::NamingContext::_narrow(o);
    CosNaming::Name name;
    name.length(1);
    name[0].id = CORBA::string_dup("Pinger_iiop");
    name[0].kind = CORBA::string_dup("");
    // 解決し RMI オブジェクトにナロー変換する
    cout << "Resolving the naming context" << endl;
    CORBA::Object_var object = context->resolve(name);
    cout << "Narrowing to the Ping Server" << endl;
    ::examples::iiop::rmi::server::wls::Pinger_var ping =
      ::examples::iiop::rmi::server::wls::Pinger::_narrow(object);
    // ping を呼び出す
    cout << "Ping (local) ..."<< endl;
    ping->ping();

    }

    ネーミング コンテキストを取得する前に、標準のオブジェクト URL (CORBA/IIOP 2.4.2 仕様の 13.6.7 節を参照) を使用して初期参照が解決されている点に注意します。サーバでのルックアップが、COS ネーミング サービス API を実装する JNDI のラッパーによって解決されています。

    このネーミング サービスにより、WebLogic Server アプリケーションで論理名を使ってオブジェクト参照が公開できるようになっています。CORBA ネーム サービスから提供されるものは以下のとおりです。

  8. IDL クライアント アプリケーションでは、WebLogic Server の JNDI ツリー内の名前をルックアップするように CORBA ネーミング サービスに依頼することで、オブジェクトを見つけられます。上記の例では、以下のコマンドを使ってクライアントを実行します。
  9. Client.exe -ORBInitRef NameService=iioploc://localhost:7001/NameService.

 

Skip navigation bar  ページの先頭 前 次