ORB の輪

〜 第一回 〜

株式会社 オージス総研
オブジェクトテクノロジーソリューション部
永田 博靖
Nagata_Hiroyasu@ogis-ri.co.jp

目次

1. はじめに
2. What is CORBA?
3. CORBA オブジェクト
4. IDL で CORBA オブジェクトを定義する
5. CORBA の開発プロセス
6. システム構成
7. CORBA オブジェクトの実装:サーバント
8. POA (Portable Object Adaptor)
9. CORBA サーバの実装 ( VisiBroker )
10. CORBA クライアントの実装 ( JavaIDL )
11. アプリケーションの実行
12. 次回は・・・
13. 参考資料 ・ URL
補足. 環境設定

1. はじめに

CORBA が OMG で仕様化されてから 10 年以上が経ちました。現在、CORBA は非常に成熟した技術となっており、あらゆる分野に適用できる安定した技術として定着しています。最近では、組み込み分野でも CORBA が適用されるような状況です。

CORBA の優れた特徴として、異なる ORB 製品間でのインタオペラビリティとポータビリティがあります。インタオペラビリティというのは、異なる ORB 製品間での相互接続性のことです。これは、CORBA 2.0 によって CORBA の通信プロトコルとして IIOP が仕様化されたことによって保証されています。また、ポータビリティというのは、異なる ORB 製品間でのソースコードの移植性のことです。この移植性は、CORBA 2.2 によって POA が仕様化されることによって、100 %ポータブルなアプリケーションを開発することが可能となっています。現在(2002年11月21日)、CORBA のバージョンは 3.0.1 [1] になりますが、POA が仕様化された CORBA 2.2 以降からは大きな変更はなく、拡張性や信頼性についての仕様が追加されているような状況です。そういう意味で、やはり CORBA は非常に安定した技術であると言えます。

と、 いきなり CORBA の現在の状況について簡単に説明しましたが、CORBA を知らない方は、・・・って思うだけでしょうね。でも、もう少し我慢して読んでください。本連載記事では、CORBA を良く知らない方を対象として、簡単なサンプルを交えながら CORBA の世界を解説していきます。また、それと同時に様々な CORBA 準拠の ORB 製品を取り上げ、異なる ORB 製品をどんどん接続していくことにもチャレンジしていく予定です。この連載記事が終了する頃には、CORBA がいかにポータビリティとインターオペラビリティに優れいるかが理解できるでしょう(たぶん)。

さて、第一回目では、 CORBA 準拠の ORB 製品として VisiBroker と JavaIDL を利用します。VisiBroker は、Borland Enterprise Server VisiBroker Edition (以降、BES VisiBroker Edition と略す) で利用可能な CORBA 2.4 準拠の ORB 製品です。あまり知られていない話ですが、Java 言語が使用できる ORB 製品として最初に実装された商用の ORB 製品が VisiBroker です。一方、JavaIDL は Sun が提供しているフリーの ORB 製品です。今回は、J2SE 1.4.1 に含まれている CORBA 2.3 準拠 の JavaIDL を利用します。

2. What is CORBA

先ほどから CORBA、CORBA ・・・と言っていますが、CORBA って何?って思っている方もいると思うので、最初に簡単に説明しておきましょう。CORBA は Common Object Request Broker Architecture の略で、分散オブジェクト技術の一つです。分散オブジェクト技術には他にも、Java 間でリモート・オブジェクトのメソッド呼び出しを実現する JavaRMI (Java Remote Method Invocation) [2] や、 Microsoft 社が提唱する、Windows 環境間で部品化されたプログラムをネットワークを通じて利用する COM+(Component Object Model plus) [3] などがあります。しかし、CORBA はこれらの分散オブジェクト技術とは異なり、プログラミング言語非依存、プラットフォーム非依存、 ネットワークプロトコル非依存という非常に強力な基盤をアプリケーションの開発者に提供します。

図 1 はアプリケーションの基盤として CORBA を採用した場合のシステムを表しています(実際にはこのようなマルチプラットフォーム、マルチ言語のシステムはありませんが)。この図 1 に示しているように、CORBA では、ORB と呼ばれる一本の仮想的なバスに対して、様々なソフトウェアコンポーネント(図 1 中:黄色い丸)を接続し、それらソフトウェアコンポーネントが透過的に通信を行える基盤をアーキテクチャとして採用しています [4]

では、この図を用いて、CORBA が持っているプログラミング言語非依存、プラットフォーム非依存、ネットワークプロトコル非依存という特長について見ていきましょう。

CORBA のアーキテクチャ
図 1: プログラミング言語、プラットフォーム、ネットワークプロトコルを意識させないアーキテクチャ

まず、プログラミング言語非依存について見てみましょう。CORBA でいうプログラミング言語非依存とは、通信相手のプログラミング言語を意識することなく、メソッド呼び出しが可能であることを表しています。つまり、Java 言語で実装されたクライアントからネットワーク上にある C++ 言語のオブジェクトを Java 言語のオブジェクトであるかのようにメソッド呼び出しが可能であるということです。さらに、分散オブジェクト技術であるので、ネットワーク上に存在するオブジェクトをあたかもローカルにオブジェクトが存在するかのようにメソッド呼び出しを行うことができます。

プラットフォーム非依存についてはどうでしょうか。 CORBA では、仕様レベルで API が明確に定められているため、どのようなプラットフォームに対しても統一的な API を使用してアプリケーションを開発することができます。従って、Windows や Linux, Solaris といった様々なプラットフォームの違いを意識したコーディングを行う必要はありません。つまり、プラットフォームにとらわれない移植性の高いプログラムを作成することが可能となっています。

さて、最後のネットワークプロトコル非依存ですが、これはどうでしょうか。CORBA は通信プロトコルとして IIOP (Internet Inter-Orb Protocol) が利用されるので、ネットワークプロトコル非依存ではないと思われる方がいるかもしれません。しかし、実は、CORBA は通信プロトコルとして、SOAP (Simple Object Access Protocol) を利用することも可能となっています [5] 。実際、OMG では CORBA の SOAP マッピングの標準化作業に取り組んでいます。従って、将来的には、ネットワークプロトコルとして IIOP 以外のプロトコルが利用されるかもしれません。

3. CORBA オブジェクト

CORBA は分散オブジェクト技術の一つであるので、当然、オブジェクトを扱いますが、CORBA では一般的に知られているオブジェクトではなく、CORBA オブジェクトというものを扱います。図 2 はこの一般的なオブジェクトと CORBA オブジェクトの違いを表しています。一般的なオブジェクト(クラス)は、内部情報である属性とそれにアクセスするためのメソッドを合わせたものであると考えことができます。一方、CORBA オブジェクトというのは、そのオブジェクトに対してもう一枚インターフェースと呼ばれる殻を被せたものであると概念的には考えることができます。つまり、このインターフェースを被せた CORBA オブジェクトが ORB 上で外部に対してサービスを公開するオブジェクトということになります。

CORBA のオブジェクトモデル
図 2: CORBA のオブジェクトモデル

CORBA では、このインターフェースと呼ばれる殻を IDL ( Interface Definition Language ) によって定義します。この IDL がプログラミング言語非依存なインターフェース定義言語として設計されており、IDL から様々プログラミング言語へのマッピングが規定されているので、異なる言語が混在するシステムを構築することが可能となっています。また、CORBA では、この IDL で定義されたインターフェースを介してのみメッセージのやり取りを行います。従って、IDL が実装言語を隠蔽し、言語を意識することなくオブジェクトに対するオペレーションの呼び出しが可能であるというわけです( CORBA では IDL で定義したメソッドのことをオペレーションと呼びます )。

4. IDL で CORBA オブジェクトを定義する

では、実際に IDL を使って CORBA オブジェクトを定義してみましょう。題材として銀行口座アプリケーションを取り上げます。今回は銀行口座アプリケーションの CORBA オブジェクトとして銀行口座オブジェクトを考えてみます(この連載記事ではこの銀行口座アプリケーションを拡張していく予定です)。

図 3 に今回使用する CORBA オブジェクトを UML のクラス図で記述しました。CORBA オブジェクトであることを表すために UML Profile for CORBA [6] で定められている CORBAInterface というステレオタイプを用いています。

銀行口座 CORBA オブジェクトのクラス図
図 3: 銀行口座 CORBA オブジェクトのクラス図

このクラス図に記述された Account CORBA オブジェクトは IDL を用いて以下のように記述することができます。

  1:// Bank.idl
  2:
  3:module Bank {
  4:  interface Account {
  5:    long getBalance();
  6:    string getName();
  7:  };
  8:};

IDL では interface ( 4 行目) と呼ばれるキーワードを用いて CORBA オブジェクトを定義します。そして、その CORBA オブジェクト(この例では、Account )が持つオペレーションを中括弧{}( 4-7 行目) の中に定義します。オペレーションの宣言部分 ( 5-6 行目) は、オペレーションのシグネチャだけを定義することになるので、そのオペレーションが持つ、戻り値、オペレーション名、引数を記述します。今回は、残高照会のオペレーションである getBalance ( 5 行目) と銀行の口座名を取得するオペレーションである getName ( 6 行目) を宣言しています。それぞれのオペレーションの戻り値に long 型 ( 5 行目) と string 型 ( 6 行目) が使用されていますが、これは IDL の仕様でその取りうる値の範囲が決められた IDL の型です。それぞれの型は、例えば Java 言語にマッピングすると、int 型と java.lang.String クラスにマッピングされることになります。なお、module ( 3 行目) というキーワードは、名前空間を与えます。Java 言語の package ようなものです。もちろん、module は、Java 言語だと、package にマッピングされます。

5. CORBA の開発プロセス

さて、IDL によって CORBA オブジェクトを定義しましたが、 IDL で定義した CORBA オブジェクトは実際にどのように実装するのでしょうか。

図 3 は IDL で CORBA オブジェクトを定義した後の一般的な実装手順を表しています。 CORBA では、IDL で CORBA オブジェクトを定義した後、ORB ベンダが提供する IDL コンパイラによって、スタブソース、スケルトンソース、各種ユーティリティソースを自動生成します。つまり、IDL コンパイラは、そのようなソースコードを自動生成するソースコードジェネレータのような機能を持つツールになります。従って、実装に使用する言語用の IDL コンパイラを使って、スタブソース、スケルトンソース、各種ユーティリティソースを生成し、実装していくことになります。

開発プロセス
図 3: 開発プロセス

さて、スタブ、スケルトンという用語が出てきましたが、これらは一体何を行うのでしょうか。実は、このスタブ、スケルトンが、クライアントとサーバ間の通信に関する複雑な処理を隠蔽することになります。従って、クライアント、サーバを実装する際にスタブ、スケルトンを使用することによって、ネットワークを意識することなく実装することができるようになっています。

図 3 にも示していますが、スケルトンは、サーバ側の CORBA オブジェクトを実装するために使用します。一方、スタブは、クライアントを実装するために使用します。なお、他の分散オブジェクト技術では、CORBA のスタブと同等の機能を提供するものをプロキシと言ったりすることがあるので注意してください。

6. システム構成

これから上記の開発プロセスに従って CORBA アプリケーションを作成していくわけですが、その前に今回作成するアプリケーションの環境について整理しておきます。図 4 を見てください。今回は、サーバ側に VisiBroker、 クライアント側に JavaIDL を使用します。最初のとっかかりには、Java 言語が最適だと思いますので、サーバ、クライアントともに Java 言語を使用します。

システム構成
図 4: システム構成

図 4 では、2 台 の PC を用いた構成になっていますが、PC を 2 台も持っている方は少ないと思いますので、1 台の PC で動作させることにしましょう。Windows 2000 マシンを準備して以下のようなディレクトリ構成を作成してください。

CORBA
VisiBroker
BES VisiBroker Edtion 5.1 用のディレクトリ
JavaIDL
Java IDL (J2SE 1.4) 用のディレクトリ

VisiBroker ディレクトリでは、BES VisiBroker Edition 5.1 を利用して CORBA オブジェクトとサーバを実装していきます。一方、JavaIDL ディレクトリでは、J2SE 1.4.1 を利用してクライアントを実装していきます。VisiBroker と JavaIDL を使用するための環境設定に関しては、補足を参照してください。

7. CORBA オブジェクトの実装:サーバント

CORBA では、IDL で定義した CORBA オブジェクトの実装をサーバントと呼びます。CORBA オブジェクトは仮想的なもので、サーバントはその実体であると言えば理解しやすいと思います。

では、実際にサーバントを作成してみましょう。まず、サーバントを作成するために必要なスケルトンを IDL コンパイラによって自動生成します。VisiBroker の Java 言語用の IDL コンパイラコマンドは idl2java です。VisiBroker ディレクトリで、コマンドプロンプトから次のように入力して、Bank.idl ファイルをコンパイルします。

VisiBroker> idl2java Bank.idl

idl2java コマンドを実行すると、実行したディレクトリで Bank というディレクトリが作成され、以下のスタブソース、スケルトンソース、各種ユーティリティソースが生成されます。

次のプログラム AccountImpl.java は、CORBA オブジェクトの実装であるサーバントを表しています。 サーバントの実装で重要な部分は、AccountPOA のスケルトンクラスを継承しているところです ( 3 行目) 。

  1:// AccountImpl.java
  2:
  3:public class AccountImpl extends Bank.AccountPOA {
  4:  private String _name;
  5:  private int   _balance;
  6:
  7:  public AccountImpl(String name, int balance) {
  8:    _name = name;
  9:    _balance = balance;
 10:  }
 11:  public int getBalance() {
 12:    return _balance;
 13:  }
 14:  public String getName() {
 15:    return _name;
 16:  }
 17:}

スケルトンクラスを継承すれば、後は IDL で定義したオペレーションを実装するだけです。IDL で定義したそれぞれのオペレーションは、AccountOperations インターフェースに宣言されています。従って、AccountOperations インターフェースを参照すれば、IDL で定義したオペレーションがどのように Java 言語にマッピングされているかが分かります。以下は、AccountOperations インターフェースから関係のある部分を抜粋したものです。IDL の long 型、string 型が、それぞれ、int 型、java.lang.String クラスにマッピングされていることが分かります。

// AccountOperations.java
    ・
    ・
    ・
public interface AccountOperations {
  /**
   * <pre>
   *   long getBalance ();
   * </pre>
   */
  public int getBalance ();

  /**
   * <pre>
   *   string getName ();
   * </pre>
   */
  public java.lang.String getName ();

}

サーバントの実装である AccountImpl.java に話を戻しましょう。サーバントが継承している AccountPOA クラスは AccountOperations インターフェースを implements しています。しかし、AccountPOA クラスは AccountOperations インターフェースで定義されているメソッドを実装していません。従って、AccountPOA を継承するサーバント AccountImpl クラスでこれらのメソッドを実装する必要があります( 11-13 行目, 14-16 行目) 。

また、IDL では宣言してませんが、銀行口座オブジェクトということで、属性として口座名 _name ( 4 行目) と残高 _balance ( 5 行目) を持たせています。さらに、口座名と残高を引数として受け取るコンストラクタ (7 行目) も追加しています。サーバントにはコンストラクタだけでなく、 IDL で定義していないメソッドも追加することが可能です。しかし、追加したメソッドについては、IDL として宣言されていないので、リモートから呼び出すことができないことに注意してください。

これで、サーバントが作成できました。次は、CORBA クライアントからのリクエストを受け付ける CORBA サーバの実装について見ていきます。 その後、CORBA クライアントを作成することにします。

8. POA (Portable Object Adaptor)

CORBA サーバの実装を見ていく前に CORBA のアーキテクチャで重要な POA (Portable Object Adaptor) について取り上げます。POA を取り上げるのは、CORBA サーバと POA とが密接に関係しているからです。従って、POA を理解しないと CORBA サーバの処理の流れについて理解できません。しかし、POA は CORBA の中でも理解しにくい機能の一つであり、その機能の全体について紹介するには時間がかかるので、ここでは重要な部分だけを簡単に説明します。

POA の役割は CORBA オブジェクトに対するクライアントからのリクエストを適切なサーバントにディスパッチすることです。 つまり、CORBA オブジェクトとサーバントを関連付けることが POA の主な責務になります。また、POA には、POA の振る舞いを決定するポリシーを設定することができます。設定するポリシーによって、CORBA オブジェクトとサーバントとの関連付けが決定します。

POA の概略図
図 4: POA の概略図

POA の概略図を図 4 に示します。RootPOA、POA マネージャ等の初めて見る用語が出てきたかと思います。まず、これらの用語について説明します。

RootPOA
すべての POA の親に当たる特別な POA です。RootPOA には、あらかじめ決められたポリシーが設定されています。
POA マネージャ
POA を管理します。POA マネージャの状態によってクライアントからのリクエストがどのように処理されるかが決定されます。アクティブ状態、非アクティブ状態、停止状態、破棄状態の 4 つの状態が存在します。
オブジェクト ID
一つの POA 内で CORBA オブジェクトを一意に特定するための識別子です。
アクティブオブジェクトマップ
サーバントと オブジェクト ID を関連付けるためのテーブル表です。

POA には、特別な POA として RootPOA が存在します。RootPOA は開発者が生成するのではなく、あらかじめ存在するので、デフォルトのポリシーが設定されています。この RootPOA のポリシーは開発者が変更することができません。もし、RootPOA と異なるポリシーの POA が必要な場合は、RootPOA から新しいポリシーを持った子供の POA を生成する必要があります。POA を新しく生成していくことにより、RootPOA を親とした階層構造を作成することができます。これによって POA に親と子の関係ができますが、親と子の関係にポリシーの継承関係がないことには注意してください。

さて、RootPOA のデフォルトのポリシーでは、アクティブオブジェクトマップを利用してサーバントを管理することになります。アクティブオブジェクトマップは、テーブル表のようなもので、オブジェクト ID とサーバントが関連付けられています。クライアントからのリクエストを POA が受け付けたときは、アクティブオブジェクトマップを参照し、適切なサーバントに対してメッセージが送信されることになります。

すべての POA は POA マネージャによって管理されます。POA マネージャの状態によって、POA がクライアントからのリクエストを受信できるかどうかが決定されます。クライアントからのリクエストを受け付けるようにするには、POA マネージャをアクティブ状態にする必要があります。

以上が、POA の概要です。POA とそれらの関係について掴めたでしょうか。では、この POA を利用した CORBA サーバの実装についてみてみましょう。

9. CORBA サーバの実装 ( VisiBroker )

クライアントからのリクエストを受け付ける CORBA サーバを実装します。 CORBA サーバは、次のような流れで処理を実装します。

  1. ORB の初期化
  2. RootPOA のリファレンスの取得
  3. サーバントのインスタンス化
  4. RootPOA のアクティブオブジェクトマップにサーバントを登録
  5. POA マネージャの活性化
  6. イベントループ

では、CORBA サーバの実装である Server.java を見ながら、上記処理の流れを追っていきましょう。

  1:// Server.java
  2:
  3:import org.omg.PortableServer.*;
  4:import java.io.*;
  5:
  6:public class Server {
  7:  public static void main(String[] args) {
  8:    try {
  9:      // ORB の初期化
 10:      org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);
 11:
 12:      // RootPOA のオブジェクトリファレンスを取得
 13:      POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
 14:
 15:      // サーバントの生成
 16:      AccountImpl accountServant = new AccountImpl("OGIS-RI",1000);
 17:
 18:      // RootPOA 上でサーバントの活性化
 19:      rootPOA.activate_object(accountServant);
 20:
 21:      // POA マネージャの活性化
 22:      rootPOA.the_POAManager().activate();
 23:
 24:      // サーバントからオブジェクトリファレンスを取得
 25:      org.omg.CORBA.Object object = rootPOA.servant_to_reference(accountServant);
 26:
 27:      // オブジェクトリファレンスをファイルに出力
 28:      FileWriter output = new FileWriter("account.ior");
 29:      output.write(orb.object_to_string(object));
 30:      output.close();
 31:
 32:      // クライアントからのリクエストに待機
 33:      System.out.println("Server is ready.");
 34:      orb.run();
 35:    }catch (Exception e) {
 36:      e.printStackTrace();
 37:    }
 38:  }
 39:}

まず最初に、ORB の初期化ということで、ORB.init メソッドを実行します (10 行目)。ORB の初期化の処理が今一つ掴めない場合は、CORBA サーバを ORB の仮想的なバスに対して接続すると考えれば理解しやすいと思います。次に ORB 上に存在している RootPOA のリファレンスを取得します(13 行目)。ORB に対して resolve_initial_references("RootPOA") メソッドを呼び出し、それを POAHelper のヘルパークラスによって適切な型に変換することで、RootPOA のリファレンスを取得しています。

今回、RootPOA がもつデフォルトのポリシーを使用するので、RootPOA のアクティブオブジェクトマップにサーバントを登録します。まず、サーバントを生成します(16 行目)。そして、RootPOA に対して、activate_object メソッドを使用して、生成したサーバントをアクティブオブジェクトマップに登録します( 19 行目)。また、この activate_object メソッドを呼び出すと同時に、サーバントが CORBA オブジェクトとして利用可能な状態へと活性化されます。

これで、CORBA オブジェクトの準備が整いました。次は、クライアントからのリクエストを受け付けられるように POA マネージャを活性化します( 22 行目)。最後に、ORB に対して run メソッドを呼ぶことで、CORBA サーバはデーモンとしての処理のイベントループに入ります。

さて、サーバの処理の一連の流れを説明したわけですが、24 行目から 30 行目の処理については、あえて触れませんでした。ここでは、CORBA オブジェクトの位置情報であるオブジェクトリファレンスを account.ior ファイルに書き出す処理を行っています。RootPOA に対して servant_to_reference メソッドを呼ぶことで、指定したサーバントのリファレンスが取得できます。今回、クライアントでこの account.ior ファイルを使用して CORBA オブジェクトの位置情報を解決します。

サーバの処理が理解できたところで、Server.java ファイルをコンパイルしてみましょう。VisiBroker では、次のように vbjc コマンドを使用してコンパイルします。vbjc コマンドは、VisiBroker の環境を設定して、内部的に javac コマンドを実行するコマンドになります。

VisiBroker> vbjc Server.java

10. CORBA クライアントの実装 ( JavaIDL )

CORBA クライアントでは、JavaIDL の ORB を利用します。まず、CORBA クライアントを実装するためのスタブを IDL ファイルから生成します。JavaIDL の IDL コンパイラ コマンドは idlj です。次のように -fclient オプションを指定することによって、CORBA クライアントの実装に必要なファイルのみを自動生成することができます。

JavaIDL> idlj -fclient Bank.idl

idlj コマンドを実行すると、実行したディレクトリで Bank というディレクトリが作成され、以下のスタブソース、各種ユーティリティソースが生成されます。

CORBA クライアントでは、次のような流れで処理を実装します。

  1. ORB の初期化
  2. CORBA オブジェクトのリファレンスの取得
  3. CORBA オブジェクトに対するオペレーション呼び出し

では、CORBA クライアントの実装である Client.java を見ながら、上記処理の流れを追っていきましょう。

  1:// Client.java
  2:
  3:import java.io.*;
  4:
  5:public class Client {
  6:  public static void main(String[] args) {
  7:    try {
  8:      // ORB の初期化
  9:      org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);
 10:
 11:      // ファイルからオブジェクトリファレンスの読み込み
 12:      LineNumberReader input = new LineNumberReader(new FileReader("account.ior"));
 13:      org.omg.CORBA.Object object = orb.string_to_object(input.readLine());
 14:
 15:      // オブジェクトリファレンスを Account 型に変換
 16:      Bank.Account account = Bank.AccountHelper.narrow(object);
 17:
 18:      // 口座の残高の取得
 19:      int balance = account.getBalance();
 20:
 21:      // 口座名の取得
 22:      String name = account.getName();
 23:
 24:      // 残高と口座名の表示
 25:      System.out.println("The balance in " + name + "'s account is " + balance + " yen.");
 26:    }catch(Exception e) {
 27:      e.printStackTrace();
 28:    }
 29:  }
 30:}

サーバでの処理と同様に、まず最初に ORB の初期化ということで、ORB.init メソッドを実行します ( 9 行目)。この場合も CORBA クライアントを ORB の仮想的なバスに接続すると考えれば理解しやすいでしょう。次に、CORBA オブジェクトの位置情報を取得します。今回、CORBA サーバの処理で、CORBA オブジェクト Account のリファレンスを account.ior ファイルに書き出したので、このファイルから読み込むことで CORBA オブジェクト Account の位置情報を取得します( 12-13 行目)。そして、リファレンスを適切な型に変換します (16 行目)。

これで、Account の位置情報が取得できました。後は、CORBA オブジェクトに対してサービスを要求するだけです。19 行目、22 行目を見てください。CORBA オブジェクトのリファレンスを取得できれば、リモートにあるオブジェクトに対しても、ローカルのオブジェクトと同じような形式でメッセージが送信できます。最後に入手した残高と口座名を出力しています( 25 行目)。

クライアントの処理が理解できたところで、Client.java ファイルをコンパイルしてみましょう。JavaIDL を利用するので、次のように javac コマンドを使用してコンパイルしてください。

JavaIDL> javac Client.java

11.アプリケーションの実行

CORBA クライアントと CORBA サーバを作成することができました。では、CORBA サーバと CORBA クライアントを実行してみましょう。 まず、VisiBroker の環境 ( VisiBroker ディレクトリ ) で、 vbj コマンドを利用して CORBA サーバを起動します。vbj コマンドは、VisiBroker の環境を設定して、内部的に java コマンドを実行するコマンドになります。

VisiBroker> vbj -Dvbroker.agent.enableLocator=false Server

CORBA サーバの起動が成功すると、「Server is ready.」 というメッセージがコンソール上に表示されます。また、VisiBroker ディレクトリ内に account.ior というファイルも生成されます。account.ior ファイルには、CORBA オブジェクトの位置情報であるオブジェクトリファレンス ( IOR : Interoperable Object Reference ) が格納されています。CORBA クライアントでは、この IOR を利用して CORBA オブジェクトに対してサービスを要求します。

-Dvbroker.agent.enableLocator=false は、VisiBroker 特有のプロパティです。 VisiBroker では、サーバとクライアントの起動時に、デフォルトで CORBA オブジェクトの位置情報を管理する Smart Agent (※1)の機能を利用するようになっています。ここでは、Smart Agent の機能を利用しないので、このプロパティを false に設定しています。

※1. Smart Agent は、CORBA オブジェクトの位置情報を管理する VisiBroker 独自のサービスです。Smart Agent の機能を利用すると、サーバの負荷分散やフェイルオーバといったフォールトトレランス性を高めるアプリケーションが簡単に作成できます。

CORBA サーバが起動できたので、CORBA クライアントを実行します。JavaIDL の環境 ( JavaIDL ディレクトリ ) で、次のコマンドを使用して CORBA クライアントを起動します。CORBA クライアントを起動する前に、CORBA オブジェクトの位置情報である account.ior ファイルを JavaIDL ディレクトリにコピーしておきます。

JavaIDL> java Client

CORBA クライアントの起動が成功すると、「The balance in OGIS-RI's account is 1000 yen.」というメッセージがコンソール上に表示されます。 正しく表示されましたでしょうか。

さて、最後に、CORBA オブジェクトの位置情報である IOR について取り上げたいと思います。account.ior ファイルをテキストエディタ等で開いてみてください。次のような形式の内容が表示されると思います。

IOR:000000000000001549444c3a42616e6b2f4163636f756e743a312e3000000000000000・・・・・・・・・・・・・

これを見ても何だか分かりませんね。しかし、ここには、分散環境でオブジェクトの身元を一意に特定し、そのオブジェクトに到達するための必要な情報がすべて格納されています。 VisiBroker には、この IOR に格納されている情報を解釈するためのコマンド printIOR が用意されています。この printIOR コマンドを利用して IOR の情報を表示してみましょう。

VisiBroker> printIOR account.ior

Interoperable Object Reference:
  Type ID: IDL:Bank/Account:1.0
  Contains 1 profile.
  Profile 0-IIOP Profile:
    version: 1.2
    host: 192.168.1.100
    port: 1849
    Object Key: TransientId[poaName=/,id={4 bytes: (0)(0)(0)(0)},sec=483,usec=49
1662499,key_string=%00VB%01%00%00%00%02/%00%20%20%00%00%00%04%00%00%00%00%00%00%
01%e3%1dN,%a3]
    VB Capability component:
    ORB_TYPE Component: VBJ 4.x
    Code Sets Component: native char codeset:ISO 8859_1 conversion_code_sets:, n
ative wchar codeset:ISO UTF-16 conversion_code_sets:

この内容から IOR には、CORBA オブジェクトのインターフェース情報 ( Type ID ) や CORBA オブジェクトが起動しているホストの IP アドレス ( host )、ポート番号 ( port ) 等の情報が格納されていることが分かります。なお、オブジェクトキー ( Object Key ) は、CORBA サーバがオブジェクトを一意に特定するためのデータを表しています。このオブジェクトキーのフォーマットは、CORBA の仕様では標準化されておらず、ORB の実装に任されていることになっています。

12. 次回は・・・

今回は、CORBA を理解していただくために単純な銀行口座アプリケーションを例に取りました。また、CORBA オブジェクトの位置情報であるオブジェクトリファレンスをファイル経由でやり取りしました。次回からは、分散アプリケーションを構築するうえで便利な共通のサービスである CORBA サービスについて取り上げていきます。まずは、CORBA オブジェクトの位置情報を管理するネーミングサービス( CORBA サービスの一つ)を導入します。 また、POA に関しても詳しく解説したいと思います。

13. 参考資料 ・ URL

  1. 『 CORBA 3.0.1 specification 』 OMG Document formal/02-11-01
  2. Java Remote Method Invocation (RMI)
  3. Microsoft COM テクノロジー
  4. 『ソフトウェア アーキテクチャ』 Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal/著, 金澤 典子, 水野 貴之, 桜井 麻里, 関 富登志, 千葉 寛之/訳, 近代科学社 pp.94-117.
  5. いまなぜCORBAなの? 小野沢 博文.
  6. 『 UML Profile for CORBA specification 』 OMG Document formal/02-04-01
  7. Borland Enterprise Server Documentation
  8. Java IDL テクノロジドキュメント

補足. 環境設定

今回使用する ORB 製品の環境の設定方法について説明します。本記事では、複数の ORB 製品を利用することになるので、基本的にシステム環境変数には、ソフトウェアに関する環境変数を設定しません。替わりにバッチファイルを利用して、利用する ORB 製品を切り替えます。

まず、BES VisiBroker Edition と J2SE 1.4.1 を以下のサイトよりダウンロードして下さい。

ダウンロードが完了したら、インストールを行ってください。 インストールディレクトリ以外はデフォルトのままでインストールしてかまいません。以下のディレクトリにインストールすると仮定します。

次のようなバッチファイルを作成してください。 それぞれ bes51.bat ファイル、jdk141.bat ファイルとします。

@echo off

set VBROKERDIR=C:\bes51
set VBROKER_ADM=%VBROKERDIR%\var\servers\%COMPUTERNAME%\adm

set JAVA_HOME=%VBROKERDIR%\jdk

set include=%include%;%VBROKERDIR%\include;
set lib=%lib%;%VBROKERDIR%\lib

set PATH=%VBROKERDIR%\bin;%JAVA_HOME%\bin;%path%

echo Set Environment for Borland Enterprise Server 5.1
@echo off

set JAVA_HOME=C:\jdk141
set PATH=%JAVA_HOME%\bin;%PATH%

echo Set Environment for JDK 1.4.1

6. システム構成 」 で作成する VisiBroker ディレクトリ、JavaIDL ディレクトリで、それぞれ bes51.bat、jdk141.bat を実行します。以上で今回使用する ORB 製品の環境が構築できます。



© 2002 OGIS-RI Co., Ltd.
Index Next
Index Next