![]() ![]() ![]() ![]() |
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 クライアント使用型 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) で記述されます。IDL を特定の言語にマップするには、IDL コンパイラで IDL をコンパイルします。IDL コンパイラによって、スタブやスケルトンといった多くのクラスが生成されます。これらのクラスは、クライアントやサーバで、リモート オブジェクトへの参照の取得、リクエストの転送、および受信した呼び出しのマーシャリングに使用されます。IDL クライアントを使用する場合でも、以降の各節で示すように、まず Java リモート インタフェースおよび実装クラスの作成からプログラミングを始めて、その後で IDL を生成し、WebLogic クライアントおよび CORBA クライアントとの相互運用性を実現することを強くお勧めします。IDL でコードを記述した後で、その逆マッピングによって Java コードを作成することもできますが、その方法は難しく、バグも多数発生するのでお勧めしません。
IDL と RMI-IIOP モデルの関係を以下の図に示します。
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
サービスが実装されています。
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 のサポート状況に関して Oracle で検証した ORB とその結果を以下の一覧表に示します。
Objects-by-Value の詳細については、『WebLogic RMI プログラマーズ ガイド』の「オブジェクトの値渡しに関する制約」を参照してください。
CORBA/IDL を使用した RMI over IIOP アプリケーションを開発するには、以下の手順に従います。
-idl
オプションを使用して WebLogic RMI コンパイラまたは WebLogic EJB コンパイラを実行し、IDL ファイルを生成します。
IDL ファイルをコンパイルすると、必要なスタブ クラスが生成されます。これらのコンパイラの概要については、「WebLogic RMI について」および『WebLogic エンタープライズ JavaBean プログラマーズ ガイド』を参照してください。また、Java Language Mapping to OMG IDL Specification で Java IDL 仕様についても参照してください。
以下のコンパイラ オプションは、RMI over IIOP に固有のものです。
オプションの適用例を、次の RMI コンパイラの実行例で示します。
> java weblogic.rmic -idl -idlDirectory /IDL rmi_iiop.HelloImpl
このコンパイラでは、実装クラスのパッケージに従って、IDL ファイルを、idlDirectoy
のサブディレクトリ内に生成します。たとえば、上記のコマンドの場合には、Hello.idl
ファイルが /IDL/rmi_iiop
ディレクトリに生成されます。idlDirectory
オプションが使用されない場合には、IDL ファイルは、スタブ クラスやスケルトン クラスの生成先からの相対パスに生成されます。
WebLogic コンパイラで生成された IDL ファイルには、#include orb.idl
ディレクティブが含まれています。この IDL ファイルは各 ORB ベンダから提供されます。orb.idl
ファイルは、WebLogic 配布キットの \lib
ディレクトリにあります。このファイルは、WebLogic Server に付属の JDK に含まれている ORB で使用するためだけに用意されているものです。
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 ネーム サービスから提供されるものは以下のとおりです。
Client.exe -ORBInitRef NameService=iioploc://localhost:7001/NameService
.
![]() ![]() ![]() |