CORBA および Java IDL の使用法


CORBA について

CORBA (Common Object Request Broker Architecture) は、Object Management Group (OMG) コンソーシアムによる分散オブジェクトの標準アーキテクチャです。1989 年以来、OMG は Object Request Broker (ORB) というオープンなソフトウェアバスアーキテクチャの仕様策定を使命としてきました。ORB を利用することにより、異なるベンダーにより作成されたオブジェクトコンポーネントを、複数のネットワークおよびオペレーティングシステム経由で相互運用することができます。この標準規格により、CORBA オブジェクトは、相手のオブジェクトの場所、また要求するオブジェクトがどの言語で実装されているかを知ることなく相互に呼び出すことができます。CORBA オブジェクトへのインタフェースを定義するために、OMG の仕様による Interface Definition Language (IDL) が使用されます。

CORBA オブジェクトは、以下の点で典型的なプログラミング言語のオブジェクトと異なります。

Java IDL について

Java IDL は JDK 1.2 とともに提供される Object Request Broker です。idltojava コンパイラ (Java Developer Connection からダウンロード可能) とともに使用することで、Java プログラミング言語から CORBA オブジェクトを定義、実装、およびアクセスできます。Java IDL は CORBA/IIOP 2.0 Specification (orbos/97-02-25) および IDL-to-Java Language Mapping (orbos/98-01-06 Final) に準拠しています。

Java IDL ORB は一時 CORBA オブジェクトをサポートします。 一時 CORBA オブジェクトとは、有効期間がサーバプロセスの有効期間内に限定されているオブジェクトのことです。Java IDL はまた、オブジェクトをツリー構造のディレクトリ構造に編成するために、一時ネームサーバをサポートします。一時ネームサーバは、CORBAservices: Common Object Services Specification で定義されたネームサービス仕様に準拠しています。一時オブジェクトおよびネームサーバについては、このページの後の部分で説明します。

Java IDL は、その一部としてインタフェースリポジトリを提供しません。通常の状況下ではクライアントが生成されたスタブファイルにアクセスするため、インタフェースリポジトリは必要ありません。

CORBA 概念の概要

このセクションで紹介する概念は、CORBA/IIOP 2.0 Specification でより詳しく説明されています。

クライアントからサーバの CORBA オブジェクト実装に送信されるメソッド要求を、下の図に示します。クライアントは、CORBA オブジェクトのメソッドを呼び出す任意のコード (おそらくクライアント自体が CORBA オブジェクト) です。サーバントとは、オブジェクト実装のインスタンスで、CORBA オブジェクトを実装する実際のコードおよびデータのことです。

[requestpath image]

CORBA オブジェクトのクライアントはオブジェクトへのオブジェクト参照を持ち、クライアントはこのオブジェクト参照を使ってメソッド要求を発行します。サーバオブジェクトがリモートにある場合、オブジェクト参照はスタブ機能をポイントします。スタブは ORB の機構を使って呼び出しをサーバオブジェクトに転送します。スタブコードは ORB を使ってサーバオブジェクトを実行しているマシンを識別し、そのマシンの ORB にオブジェクトのサーバへの接続を要求します。接続が成功すると、スタブコードはオブジェクト参照とパラメータを宛先オブジェクトの実装にリンクしたスケルトンコードへ送信します。スケルトンコードは呼び出しとパラメータを宛先オブジェクトの実装に適した形式に変換し、オブジェクトを呼び出します。結果または例外が同じパスを経由して返されます。

クライアントは、CORBA オブジェクトの位置、実装の詳細、オブジェクトへのアクセスに使用される ORB の種類のいずれもしりません。異なる ORB 間の通信は OMG 仕様の Internet InterORB Protocol (IIOP) により行われます。 [CORBA/IIOP 2.0:ch 9,10]

クライアントは、CORBA オブジェクトのインタフェースで指定されたメソッドを呼び出すだけの場合もあります。CORBA オブジェクトのインタフェースは、OMG Interface Definition Language (IDL) を使って定義されています。[CORBA/IIOP 2.0 ch3] インタフェースは、オブジェクト型を定義し、名前付きメソッドとパラメータのセット、またメソッドが返す例外の型を指定します。idltojava のような IDL コンパイラは、CORBA オブジェクト定義を OMG 言語マッピングに従って特定のプログラミング言語に翻訳します。このようにして、idltojava コンパイラは IDL-Java 言語マッピングに従って IDL 定義を Java の構造に翻訳します。

スタブおよびスケルトンファイルは、オブジェクト型ごとに idltojava コンパイラにより生成されます。スタブファイルは、クライアントが自身のプログラミング言語で IDL 定義のメソッドにアクセスすることを可能にします。サーバスケルトンファイルは、オブジェクトの実装を ORB の実行環境に「糊付け」します。ORB はスケルトンを使ってメソッドをオブジェクト実装のインスタンス (サーバント) にディスパッチします。

CORBA オブジェクトの定義と実装

CORBA オブジェクト開発の目標は、「オブジェクトサーバ」または単なる「サーバ」の作成と登録です。サーバは、1 つ以上のオブジェクト型の実装を含み、ORB に登録されているプログラムです。たとえば、デスクトップパブリッシングサーバを開発して、そこに Document オブジェクト型や Paragraph オブジェクト型、その他の関連するオブジェクト型を実装することもできます。

CORBA オブジェクトのインタフェース

CORBA オブジェクトはすべて、IDL インタフェースをサポートします。IDL インタフェースはオブジェクト型を定義します。インタフェースは 1 つ以上のインタフェースから継承することが可能です。IDL の構文は、Java や C++ の構文に非常に類似しており、IDL のファイルは、C++ のヘッダファイルと同等の機能を CORBA の言語非依存の形式で提供します。IDL が各プログラミング言語にマッピングされると、その言語からオブジェクトのインタフェースにアクセスできるようになります。Java IDL により、これらの IDL インタフェースを idltojava コンパイラを使って Java に翻訳することが可能になります。IDL インタフェースごとに、idltojava は Java インタフェースおよびクライアントスタブやサーバスケルトン等の必要な他の .java ファイルを生成します。

IDL インタフェースは、クライアントからアクセス可能なオペレーション、例外、および型付き属性 (値) のセットを宣言します。各オペレーションにはその名前、パラメータ、結果、および例外を定義したシグニチャーが付けられています。伝統的な Hello World プログラムを IDL インタフェースの形式で記述すると、次のようになります。

module HelloApp
{
  interface Hello
  {
    string sayHello();
    };
};

エラーとなる条件が成立すると、オペレーションが例外を発生することがあります。例外の型は、遭遇したエラーの種類を指し示します。クライアントは、通常の結果に加えて、定義された例外および CORBA 標準の例外を処理する準備ができていなければなりません。

Java 言語ベースの実装

IDL インタフェースが定義され、idltojava コンパイラが .idl ファイルをコンパイルすると、メソッドの実装を含む .java ファイルが記述されます。次に、この .java 実装ファイルがコンパイルされ、idltojava により生成された .java ファイルおよび ORB ライブラリにリンクされて、オブジェクトサーバが作成されます。

オブジェクトの実装は、サポートするインタフェースのすべてのオペレーションと属性の動作を定義します。インタフェースの実装には何通りもの方法があり、特定の時間と空間のトレードオフを強調した実装もあります。実装は、インタフェースまたはオブジェクトの作成や破棄といった動作を定義します。

CORBA オブジェクトを新規に作成できるのはサーバだけであるため、オブジェクト型ごとに「ファクトリオブジェクト」インタフェースを定義、実装する必要があります。たとえば、Document がオブジェクト型である場合、create メソッドを持つ DocumentFactory オブジェクト型をサーバの一部として定義、実装します (create は予約語ではない。どのようなメソッド名でも使用できる)。これで、create メソッドの実装は、オブジェクトの作成に new を使用できるようになります。以下に例を示します。

  DocumentServant document  = new DocumentServant():
  orb.connect(document); 

destroy メソッドを Document に対して定義、実装することもできます。このメソッドを定義しないと、オブジェクトは無制限に持続することになります。(destroy も予約語ではありません。どのようなメソッド名でも使用できます。)

Java IDL ORB は、一時オブジェクトだけをサポートします。一時オブジェクトとは、その有効期間がサーバプロセスの有効期間内に限定されているオブジェクトのことです。一時オブジェクトはそのサーバプロセスが稼動を停止すると消滅しますが、一時オブジェクトの状態をファイルに格納し、作成時にこのファイルからそのオブジェクトを再度初期化するようなやり方で実装することも可能です。

クライアントの実装

クライアントコードは、idltojava によって生成された .java ファイルおよび ORB ライブラリにリンクしています。Hello World アプリケーションに、クライアントアプリケーションおよびアプレットの例があります。

クライアントは、サーバが提供する発行されたファクトリインタフェース経由でだけ CORBA オブジェクトを作成します。同様に、クライアントが CORBA オブジェクトを削除するのは、オブジェクトが削除用のメソッドを発行したときだけです。CORBA オブジェクトはネットワークに存在する多数のクライアントにより共有されるため、オブジェクトサーバだけがオブジェクトがガベージになったことがわかります。

クライアントのコードが CORBA オブジェクトへのメソッド要求を送信する唯一の方法は、そのオブジェクトのオブジェクト参照を使用する方法です。オブジェクト参照は、CORBA オブジェクトのホストマシン、ホストサーバが要求を受信するポート、およびプロセス内の特定のオブジェクトへのポインタを識別する不透明な構造です。Java IDL がサポートするのは一時オブジェクトだけなので、サーバプロセスが停止したり再起動するとこのオブジェクト参照は無効になります。

クライアントがオブジェクト参照を取得する一般的な方法は、次のとおりです。

オブジェクト参照を取得できたら、クライアントはそれを適切な型に「ナロー変換する」必要があります。IDL は継承をサポートします。継承階層の最上位は IDL の場合 Object、Java の場合 org.omg.CORBA.Object です。(org.omg.CORBA.Objectjava.lang.Object のサブクラスです。) 名前検索および非文字列化オペレーションなどは、org.omg.CORBA.Object を返します。この場合、idltojava コンパイラにより生成されたヘルパークラスを使ってオブジェクトを適切な派生型にナロー変換します。Java の実行環境は CORBA オブジェクトの正確な型を常に識別できるとは限らないため、オブジェクトは明示的に適切な型にナロー変換される必要があります。

Java IDL 一時ネームサーバ

The Java IDL 一時ネームサービスは、Java IDL とともに提供されるオブジェクトサーバです。ネームサーバを起動するには、コマンド行プロンプトで tnameserv と入力します。このオブジェクトサーバは、このページの前のセクションで説明した標準的なオブジェクト実装および呼び出し方法に適合しています。

ネームサーバは、オブジェクト参照の名前をファイルディレクトリに類似したツリー構造に格納します。クライアントは、オブジェクト参照を名前で検索または「解釈処理」します。ネームサーバは、Java IDL 一時サーバの一種であるため、tnameserv が停止すると名前を格納したディレクトリ構造全体が失われます。

詳細についてはネームサービスを参照してください。


分散アプリケーションの概念 | CORBA および Java IDL の使用法 | Java IDL 用語集
ホーム

Copyright © 1996-98 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA. 94043-1100 USA., All rights reserved.