BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic RMI over IIOP プログラマーズ ガイド

 Previous Next Contents PDF で侮ヲ  

RMI over IIOP プログラミング モデル

以下の各節では、さまざまなプログラミング モデルを用いた RMI-IIOP アプリケーションの開発方法について説明します。

 


RMI-IIOP プログラミング モデルの概要

IIOP は、異機種分散システム間の相互運用が容易になるように設計された堅牢なプロトコルで、多くのベンダによってサポートされています。 RMI-IIOP に関連する基本的なプログラミング モデルには、RMI クライアントを使用した RMI-IIOP (RMI クライアント使用型 RMI-IIOP) と IDL クライアントを使用した RMI-IIOP (IDL クライアント使用型 RMI-IIOP) の 2 種類があります。これらのモデルの機能や概念はある程度共通しています。たとえば、どちらのモデルでも Object Request Broker (ORB) および Internet InterORB Protocol (IIOP) を使用します。 ただし、これら 2 つのモデルには、異機種システム間での相互運用が可能な環境を作成するためのアプローチとしては、はっきりとした違いがあります。IIOP は単に、インタフェースが IDL か Java RMI のどちらかで記述された分散アプリケーションの転送プロトコルにすぎません。プログラムを作成する際には、IDL インタフェースと RMI インタフェースのどちらを使用するかを決めなければなりません。2 つを混在させることはできません。

分散アプリケーション環境をどのように作成するかは、いくつかの要因で決まります。RMI-IIOP を採用するためのモデルにはさまざまなものがあり、それらが提供する機能や標準の多くが共通しているので、どのモデルに従えばよいか見通しが立てにくいのが現状です。そこで、各モデルのコンポーネントとメリットを以下の表にまとめてみました。ここでは、利用可能なプログラミング モデル間の相違点をはっきりさせるために、IIOP を使用しない単純な RMI モデルも一緒に示してあります。

表2-1 RMI プログラミング モデル

クライアント

クライアントの使用言語

プロコトル

定義

メリット

RMI

Java

t3

JavaSoft RMI 仕様に準拠したクライアント。Java プログラム専用

高速でスケーラビリティが高い。最適化された WebLogic t3 プロトコルの使用によりパフォーマンスを向上。

RMI over IIOP RMI クライアント

Java

IIOP

CORBA 2.3 仕様による Objects-by-Value のサポートを利用した RMI クライアント。この Java クライアントは、標準 RMI/JNDI モデルで開発される。

Internet-Inter-ORB-Protocol による RMI。 IIOP 標準を使用。クライアントに WebLogic クラスは不要。

RMI over IIOP RMI クライアント

Java

IIOP

CORBA 2.3 仕様による Objects-by-Value のサポートを利用した RMI クライアント。この Java クライアントは、標準 RMI/JNDI モデルで開発される。

Internet-Inter-ORB-Protocol による RMI。 IIOP 標準を使用。完全にクラスタ化可能だが、クライアントが参照する weblogic.jar が必要。

RMI-IIOP CORBA/

IDL クライアント

C++、C、Smalltalk、COBOL

(OMG IDL からマッピング可能なあらゆる言語)

IIOP

CORBA 2.3 ORB を使用した CORBA クライアント。

注意 : ネームスペース衝突が起こるため、Java CORBA クライアントは RMI over IIOP 仕様ではサポートされない。

WebLogic Server と、C++、COBOL などで記述されたクライアントとの相互運用性。

RMI-IIOP Tuxedo クライアント

C++、C、COBOL、Java

(Tuxedo で OMG IDL にマッピング可能なあらゆる言語)

TGIOP (Tuxedo-General-Inter-Orb-Protocol)

Tuxedo 8.0 ローリング パッチ 15 以降で開発された Tuxedo クライアント

WebLogic Server アプリケーションと Tuxedo クライアント/サービスとの相互運用性


 

IIOP を使用しない RMI アプリケーション

RMI は、分散コンピューティングの Java-to-Java モデルです。RMI を使用すると、ネットワーク内の別の場所に存在するオブジェクトへの参照をアプリケーション側で取得することができます。RMI-IIOP モデルはすべて RMI に基づいていますが、IIOP を使用しない基本的な RMI モデルに従う場合には、Java 以外の言語で記述されたクライアントを統合することはできません。また、独自プロトコルである T3 を使用して、クライアント側に WebLogic クラスを用意することもあります。 RMI アプリケーションの開発については、『WebLogic RMI プログラマーズ ガイド』の「WebLogic RMI の実装」を参照してください。

 


RMI (Java) クライアント使用型 RMI-IIOP アプリケーション

RMI クライアントを使用した RMI over IIOP (RMI クライアント使用型 RMI over IIOP) では、RMI の機能と標準 IIOP プロトコルが一体化されており、完全に Java プログラミング言語だけで作業できるようになっています。RMI クライアント使用型 RMI-IIOP は Java-to-Java モデルであり、その場合 ORB は通常、クライアントで動作する JDK の一部となっています。RMI-IIOP では、オブジェクトは参照としても値としても渡すことができます。

RMI (Java) クライアント使用型 RMI-IIOP を適用すべき状況

RMI クライアント使用型 RMI-IIOP は J2EE プログラミング モデルを指向しており、RMI の機能と IIOP プロトコルが一体化されています。アプリケーションが Java で開発されており、IIOP の利点を活用したいと考えているのであれば、RMI クライアントを使用した RMI-IIOP モデルをお勧めします。RMI-IIOP を使用する場合、Java ユーザは RMI インタフェースのプログラムを作成したあと、基礎となる転送メカニズムとして IIOP を使用することができます。RMI クライアントは、J2EE または J2SE コンテナ (ほとんどの場合、JDK 1.3 以降) をホストとする RMI-IIOP 対応 ORB を実行します。WebLogic 固有のクラスは不要であり、必要なものはこのシナリオで自動的にダウンロードされます。クライアントの分散を最小にするにはよい方法です。 これは、配布すべきクライアントの量を最小限に抑えるよい方法です。また、通常の WebLogic RMI で用いられる独自の t3 プロトコルを使用する必要もありません。使用するのは、独自仕様でない業界標準に基づいた IIOP なのです。

RMI クライアント使用型 RMI-IIOP アプリケーションの開発

RMI クライアント使用型 RMI-IIOP を用いてアプリケーションを開発するには、以下の手順に従います。

  1. リモート オブジェクトのパブリック メソッドを、java.rmi.Remote を拡張するインタフェースに定義します。

    このリモート インタフェースには、コードをあまり記述する必要がない場合もあります。必要なのは、リモート クラスで実装するメソッドに対するメソッド シグネチャだけです。たとえば、インストール済み WebLogic Server の SAMPLES_HOME/server/src/examples/iiop/rmi/server/wls に格納されている Ping サンプルを以下に示します。

    public interface Pinger extends java.rmi.Remote {
    public void ping() throws java.rmi.RemoteException;
    public void pingRemote() throws java.rmi.RemoteException;
    public void pingCallback(Pinger toPing) throws java.rmi.RemoteException;
    }

  2. interfaceNameImpl というクラスにインタフェースを実装し、それを JNDI ツリー内にバインドしてクライアントから利用できるようにします。

    このクラスには、記述済みのリモート インタフェースを実装する必要があります。これは、インタフェースに含まれるメソッド シグネチャを実装したことを意味します。すべてのコード生成はこのクラスファイルに依存します。通常は、実装クラスを WebLogic 起動クラスとしてコンフィグレーションし、そのオブジェクトを JNDI ツリー内にバインドする main メソッドを組み込みます。以下は、先ほどの Ping の例をもとに開発した実装クラスからの抜粋です。

    public static void main(String args[]) throws Exception {
    if (args.length > 0)
    remoteDomain = args[0];
      Pinger obj = new PingImpl();
    Context initialNamingContext = new InitialContext();
    initialNamingContext.rebind(NAME,obj);
    System.out.println("PingImpl created and bound to "+ NAME);

  3. リモート インタフェースと実装クラスを Java コンパイラでコンパイルします。RMI-IIOP アプリケーションでのこれらのクラスの開発は、通常の RMI での開発と同じです。 RMI オブジェクトの開発の詳細については、「WebLogic RMI API の概要」を参照してください。

  4. 実装クラスに対して WebLogic RMI または EJB コンパイラを実行して、必要な IIOP スタブを生成します。以下のように、IIOP スタブの生成に -iiop オプションを使用する必要はもはやないことに注意してください。
    $ java weblogic.rmic nameOfImplementationClass

    Pinger サンプルの場合には、nameOfImplementationClass の部分が examples.iiop.rmi.server.wls.PingerImpl になります。

    スタブはリモート オブジェクト用のクライアントサイド プロキシで、個々の WebLogic RMI 呼び出しを対応するサーバサイド スケルトンに転送します。今度は、サーバサイド スケルトンが、その呼び出しを実際のリモート オブジェクト実装に転送します。なお、WebLogic RMI コンパイラで作成される IIOP スタブは、JDK 1.3.1_01 以降の ORB で使用するためのものである点に注意してください。他の ORB を使用する場合、それぞれの ORB ベンダのマニュアルを参照して、これらのスタブが適切かどうかを判断してください。

  5. ここまでで作成したファイル、すなわち、リモート インタフェース、それを実装するクラス、およびスタブが WebLogic Server の CLASSPATH に含まれていることを確かめます。

  6. 初期コンテキストを取得します。

    RMI クライアントは、初期コンテキストを作成しオブジェクトをルックアップする (次のステップを参照) ことで、リモート オブジェクトにアクセスします。次に、このオブジェクトは適切な型にキャストされます。

    初期コンテキストの取得では、JNDI コンテキスト ファクトリを定義する際に以下の 2 つの選択肢があります。

    パラメータとして新しい InitialContext() に渡す「Context.INITIAL_CONTEXT_FACTORY」プロパティの値を設定する際には、これらのクラスのいずれかを使用します。Sun バージョンを使用している場合は、Sun JNDI クライアント、つまり J2SE 1.3 の Sun RMI-IIOP ORB 実装を使用することになります。このことは、クライアントでの WebLogic クラスの使用を最小限に抑える場合には重要です。ただし、WebLogic の RMI-IIOP 実装を十分に活用するには、weblogic.jndi.WLInitialContextFactory メソッドを使用することをお勧めします。

    Sun JNDI クライアントおよび Sun ORB を使用する場合には、Sun JNDI クライアントでは、ネームスペースからリモート オブジェクト参照を読み込む機能はサポートされているものの、シリアライズされた汎用 Java オブジェクトの読み込みはサポートされていないことを承知しておいてください。つまり、ネームスペースから EJBHome などを読み込むことはできますが、DataSource オブジェクトを読み込むことはできません。このコンフィグレーションでは、クライアントが開始したトランザクション (JTA API) もサポートされません。また、セキュリティもサポートされていません。ステートレス セッション Bean の RMI クライアントの例では、次のコードで初期コンテキストを取得します。

    InitialContext の取得 :
    * JDK1.3 クライアントでは、Properties オブジェクトを
    * 次のように使用できる
       */
      private Context getInitialContext() throws NamingException {
    try {
    // InitialContext を取得
    Properties h = new Properties();
    h.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.cosnaming.CNCtxFactory");
    h.put(Context.PROVIDER_URL, url);
    return new InitialContext(h);
    } catch (NamingException ne) {
    log("We were unable to get a connection to the WebLogic server at "+url);
    log("Please make sure that the server is running.");
    throw ne;
    }
    /**
    * Java2 バージョンを使用して InitialContext を取得する場合。 
    * このバージョンは、jndi.properties ファイルがアプリケーションのクラスパス
    * に存在するかどうかに依存する。
    * 詳細については、
    * http://edocs.beasys.co.jp/e-docs/wls/docs70/jndi/jndi.html
    * を参照のこと
    private static Context getInitialContext()
    throws NamingException
    {
    return new InitialContext();
    }

  7. javax.rmi.PortableRemoteObject.narrow() メソッドと組み合わせてルックアップを実行するように、クライアントのコードを修正します。

    RMI over IIOP RMI クライアントが通常の RMI クライアントと異なるのは、初期コンテキストを取得する際にプロトコルとして IIOP が定義されるという点です。このため、ルックアップとキャストは、javax.rmi.PortableRemoteObject.narrow() メソッドと組み合わせて行われます。

    たとえば、RMI クライアントのステートレス セッション Bean サンプル (配布キットに付属している examples.iiop.ejb.stateless.rmiclient パッケージ) では、RMI クライアントは初期コンテキストを作成し、EJBean ホームをルックアップし、EJBean への参照を取得し、そしてその EJBean のメソッドを呼び出します。

    通常ならオブジェクトを特定のクラス タイプへキャストするような状況ではすべて、javax.rmi.PortableRemoteObject.narrow() メソッドを使用する必要があります。CORBA クライアントからは、リモート インタフェースを実装しないオブジェクトが返される可能性があります。そこで、リモート インタフェースを実装するようにオブジェクトを変換するために ORB から narrow メソッドが提供されるのです。たとえば、EJBean ホームのルックアップとその Home オブジェクトへのキャストを扱うクライアント コードは、以下に示すように、javax.rmi.PortableRemoteObject.narrow() を使用するように修正する必要があります。

    ルックアップの実行 :
    /**
    * RMI/IIOP クライアントはこの narrow 関数を使用する
    */
    private Object narrow(Object ref, Class c) {
    return PortableRemoteObject.narrow(ref, c);
    }
    /**
    * JNDI ツリーで EJB ホームをルックアップ
    */
    private TraderHome lookupHome()
    throws NamingException
    {
    // JNDI を使用して Bean ホームをルックアップ
    Context ctx = getInitialContext();
      try {
    Object home = ctx.lookup(JNDI_NAME);
    return (TraderHome) narrow(home, TraderHome.class);
    } catch (NamingException ne) {
    log("The client was unable to lookup the EJBHome. Please
    make sure ");
    log("that you have deployed the ejb with the JNDI name
    "+JNDI_NAME+" on the WebLogic server at "+url);
    throw ne;
    }
    }
    /**
    * JDK1.3 クライアントでは、次のように Properties オブジェクトを使用すると
    * 機能する
    */
    private Context getInitialContext() throws NamingException {
      try {
    // InitialContext を取得
    Properties h = new Properties();
    h.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.cosnaming.CNCtxFactory");
    h.put(Context.PROVIDER_URL, url);
    return new InitialContext(h);
    } catch (NamingException ne) {
    log("We were unable to get a connection to the WebLogic
    server at "+url);
    log("Please make sure that the server is running.");
    throw ne;
    }
    }

    url では、プロトコル、ホスト名、WebLogic Server 用のリスニング ポートを定義し、それらがコマンドライン引数として渡されます。

    public static void main(String[] args) throws Exception {
      log("¥nBeginning statelessSession.Client...¥n");
      String url       = "iiop://localhost:7001";

  8. 以下のようなコマンドでクライアントを実行することで、IIOP を通じてクライアントをサーバに接続します。
    $ java -Djava.security.manager -Djava.security.policy=java.policy    examples.iiop.ejb.stateless.rmiclient.Client iiop://localhost:7001

  9. 以下のようにして、クライアント側にセキュリティ マネージャを設定します。
    java -Djava.security.manager -Djava.security.policy==java.policy myclient

    クライアント側の RMI インタフェースをナロー変換するには、サーバから そのインタフェースに適したスタブが提供される必要があります。このクラスのロードは、JDK ネットワーク クラスローダの使用を前提としており、デフォルトでは有効にはなっていません。これを有効にするには、適切な Java ポリシー ファイルを使用して、クライアントにセキュリティ マネージャを設定する必要があります。Java セキュリティの詳細については、Sun のサイト (http://java.sun.com/security/index.html) を参照してください。なお、java.policy ファイルの例を以下に示します。

    grant {

    // 一時的にパーミッションを付与する

    permission java.security.AllPermission;

WebLogic RMI-IIOP RMI クライアント使用型 RMI-IIOP アプリケーション

WebLogic Server 7.0 では、完全にクラスタ化可能な RMI-IIOP アプリケーションを開発できる、「ファット」RMI-IIOP RMI クライアントを使用できます。この新しい WebLogic RMI-IIOP RMI クライアントを使用するには、クライアント サイドの CLASSPATH にweblogic.jar (WL_HOME/server/lib にある) を含め、-D weblogic.system.iiop.enableClient=true コマンド ライン オプションを使用して WebLogic を起動する必要があります。 この操作を行わない場合は、このクライアントの開発手順は、「RMI (Java) クライアント使用型 RMI-IIOP アプリケーション」で説明した手順と同じになります。

 


CORBA/IDL クライアント使用型 RMI-IIOP アプリケーション

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

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 コードを作成することも可能ですが、それは難しく、多数のバグを発生させることになるので、WebLogic ではお勧めしません。

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

図2-1 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 サービスを実装しています。

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

図2-2 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 とその結果を以下の一覧表に示します。

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

ベンダ

バージョン

Objects-by-Value

BEA

Tuxedo 8.1 C++ クライアント ORB

サポートしている

Borland

VisiBroker 3.3、3.4

サポートしていない

Borland

VisiBroker 4.x, 5.x

サポートしている

Iona

Orbix 2000

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

Objects-by-Value の詳細については、オブジェクトの値渡しに関する制約を参照してください。

CORBA/IDL クライアント使用型 RMI-IIOP アプリケーションの開発

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

  1. RMI クライアント使用型 RMI-IIOP アプリケーションの開発の手順 1 〜 3 を実行します。

  2. -idl オプションを付けて WebLogic RMI コンパイラまたは WebLogic EJB コンパイラを実行することで、IDL ファイルを生成します。

    IDL ファイルをコンパイルすると、必要なスタブ クラスが生成されます。 これらのコンパイラに関する一般的な情報については、「WebLogic RMI の実装」と『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。 さらに、Java IDL 仕様については、Java Language Mapping to OMG IDL 仕様を参照してください。

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

    オプション

    機能

    -idl

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

    -idlDirectory

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

    -idlFactories

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

    -idlNoValueTypes

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

    -idlOverwrite

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

    -idlStrict

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

    -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 ファイルは、スタブ クラスやスケルトン クラスの生成先からの相対パスに生成されます。

  3. IDL ファイルをコンパイルして、IDL クライアントでリモート クラスと通信するのに必要なスタブ クラスを作成します。ORB ベンダによって IDL コンパイラが提供されます。

    WebLogic コンパイラで生成された IDL ファイルには、#include orb.idl ディレクティブが含まれています。この IDL ファイルは各 ORB ベンダから提供されます。orb.idl ファイルは、WebLogic 配布キットの ¥lib ディレクトリにあります。このファイルは、WebLogic Server に付属している JDK に含まれている ORB だけで使用するためのものです。

  4. IDL クライアントを開発します。

    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 ネーム サービスから提供されるものは以下のとおりです。

  5. IDL クライアント アプリケーションでは、WebLogic Server の JNDI ツリー内の名前をルックアップするように CORBA ネーミング サービスに依頼することで、オブジェクトを見つけることができます。上記の例では、以下のコマンドを使ってクライアントを実行します。

    Client.exe -ORBInitRef NameService=iioploc://localhost:7001/NameService.

 


Tuxedo 8.1 ORB 用 WebLogic C++ クライアントの開発

WebLogic C++ クライアントは、Tuxedo 8.1 C++ クライアント ORB を使用して、WebLogic Server で動作している EJB の IIOP リクエストを生成します。 このクライアントは、Objects-by-Value および CORBA Interoperable Naming Service (INS) をサポートします。

いつ WebLogic C++ クライアントを使用するのか

以下の状況では、WebLogic C++ クライアントの使用を検討してください。

Tuxedo C++ クライアント ORB は Tuxedo 8.1 以上に同梱されていますが、WebLogic C++ クライアントは Tuxedo のライセンスがなくても開発できます。 Tuxedo の無償開発版は、BEA ダウンロード センターから入手できます。

WebLogic C++ クライアントの仕組み

WebLogic C++ クライアントは、次のモデルを使用してクライアント リクエストを処理します。

WebLogic C++ クライアントの開発

C++ クライアントを開発するには、次の手順に従います。

  1. -idl オプションを使って ejbc コンパイラを使用して、C++ クライアントと相互運用する EJB をコンパイルします。 これで、EJB の IDL スクリプトが生成されます。

  2. C++ IDL コンパイラを使用して IDL スクリプトをコンパイルし、CORBA クライアント スタブ、サーバ スケルトン、およびヘッダ ファイルを生成します。 C++ IDL コンパイラの使用方法については、「OMG IDL 構文と C++ IDL コンパイラ」を参照してください。

  3. EJB がサーバ側の実装を表すので、サーバ スケルトンを破棄します。

  4. EJB を実装する C++ クライアントを CORBA オブジェクトとして作成します。 CORBA クライアント アプリケーションの作成方法に関する一般的な情報については、『CORBA クライアント・アプリケーションの開発方法』を参照してください。

  5. Tuxedo buildobjclient コマンドを使用して クライアントをビルドします。

WebLogic C++ クライアントの制限

WebLogic C++ クライアントには、以下の制限があります。

WebLogic C++ クライアントのコード サンプル

WebLogic Server 製品では、WebLogic C++ クライアントのサンプルが提供されます。 そのサンプルは、SAMPLES_HOME¥server¥examples¥src¥examples¥iiop¥ejb ディレクトリにあります。 各サンプルの説明と、ビルド、コンフィグレーション、および実行の手順については、package-summary.html を参照してください。 コード例は、修正して再利用できます。

 


WebLogic Tuxedo Connector を使用した RMI-IIOP アプリケーション

WebLogic Tuxedo Connector を使用すると、WebLogic Server アプリケーションと Tuxedo サービスの相互運用が実現されます。

いつ WebLogic Tuxedo Connector を使用するのか

Tuxedo でアプリケーションを開発して WebLogic Server に移行する場合、または旧来の Tuxedo システムを新しい WebLogic 環境に統合しようとしている場合には、WebLogic Tuxedo Connector の使用を検討してください。 WebLogic Tuxedo Connector を使用すると、Tuxedo の拡張性と信頼性が高い CORBA 環境を利用することができます。

WebLogic Tuxedo Connector の仕組み

コネクタでは、XML コンフィグレーション ファイルを使用して、WebLogic Server からの Tuxedo サービスの呼び出しを可能にしています。 また、サービス要求に応じて、Tuxedo から WebLogic Server エンタープライズ JavaBean(EJB)やその他のアプリケーションを呼び出すこともできます。

以下のマニュアルではそれぞれ、Weblogic Tuxedo Connector と、Tuxedo での CORBA アプリケーションの構築について説明しています。

WebLogic Tuxedo Connector のコード サンプル

WebLogic Server 製品では、WebLogic Tuxedo Connector IIOP のサンプルが提供されます。 そのサンプルは、SAMPLES_HOME¥server¥examples¥src¥examples¥iiop¥ejb ディレクトリにあります。 各サンプルの説明と、ビルド、コンフィグレーション、および実行の手順については、package-summary.html を参照してください。 コード例は、修正して再利用できます。

 


RMI-IIOP での EJB の使用

RMI over IIOP を使用するエンタープライズ JavaBean を実装することで、異機種サーバ環境における以下のような EJB 相互運用性を実現することができます。

CORBA/IDL クライアントを使用する場合には、Java ソース ファイルに定義されている EJB クラスがマッピング情報の源になります。WebLogic Server には、必要な IDL ファイルを生成するための weblogic.ejbc ユーティリティが用意されています。これらのファイルは、CORBA ビューを、対象となる EJB の状態と動作で表します。weblogic.ejbc ユーティリティの用途は以下のとおりです。

weblogic.ejbc ユーティリティでは、さまざまなコマンド修飾子がサポートされています。 「CORBA/IDL クライアント使用型 RMI-IIOP アプリケーションの開発」を参照してください。

結果として生成されたファイルはコンパイラで処理されます。コンパイラはその際に、idlSources ディレクトリからソース ファイルを読み込み、CORBA C++ のスタブ ファイルとスケルトン ファイルを生成します。 値タイプ以外のすべての CORBA データ型に対しては、生成されるこれらのファイルで十分です (詳細については、「WebLogic RMI-IIOP の制約事項」を参照してください)。 生成された IDL ファイルは、idlSources ディレクトリに配置されます。なお、Java-to-IDL マッピング処理には、さまざまな問題が潜んでいます。 詳細については、Java Language Mapping to OMG IDL 仕様を参照してください。 また、Sun からも優れたガイド『Enterprise JavaBeansTM Components and CORBA Clients: A Developer Guide』が公開されています。

以下の例では、作成済みの Bean から IDL を生成する方法を示します。

> java weblogic.ejbc -compiler javac -keepgenerated
-idl -idlDirectory idlSources
build¥std_ejb_iiop.jar
%APPLICATIONS%¥ejb_iiop.jar

次に、以下のようにして、EJB インタフェースとクライアント アプリケーションをコンパイルします (この例では CLIENT_CLASSES および APPLICATIONS ターゲット変数を使用しています)。

> javac -d %CLIENT_CLASSES% Trader.java TraderHome.java
TradeResult.java Client.java

次に、先ほど weblogic.ejbc を使用して作成した IDL ファイルに対して、以下のように IDL コンパイラを実行し、C++ のソース ファイルを作成します。

>%IDL2CPP% idlSources¥examples¥rmi_iiop¥ejb¥Trader.idl
. . .
>%IDL2CPP% idlSources¥javax¥ejb¥RemoveException.idl

これで、C++ クライアントをコンパイルすることができます。

RMI-IIOP での EJB の使用方法の詳細については、WebLogic Server に付属している RMI-IIOP サンプルを参照してください。このサンプルは、インストール済み環境の SAMPLES_HOME/server/src/examples/iiop ディレクトリに入っています。

 


コード例

examples.iiop パッケージは、数多くのクライアントとアプリケーションとの接続を示したもので、WL_HOME/samples/examples/iiop ディレクトリにあります。 EJB を RMI-IIOP で使用し、C++ クライアントに接続して Tuxedo サーバとの相互運用性を設定する例も用意されています。 詳細については、サンプルの説明を参照してください。 特に WebLogic Tuxedo Connector に関するサンプルについては、/wlserver7.0/samples/examples/wtc ディレクトリを参照してください。

次の表に、WebLogic Server 7.0 で提供される RMI-IIOP のサンプルに関する情報を示します。

図2-4 WebLogic Server 7.0 の IIOP サンプル

サンプル

ORB/プロトコル

必須条件

iiop.ejb.entity.cppclient

WebLogic Server のエンティティ セッション Bean を呼び出す C++ クライアントを提供する。

  • Borland Visibroker 4.1

  • Borland Visibroker 5.0

  • Borland Visibroker 4.1 の場合 : GIOP 1.0 プロトコルを使用する。 ユーザは DefaultGIOPMinorVersion 属性を追加し、config.xml のサーバ Mbean でその値を「1」に設定する必要がある。

  • Borland Visibroker 5.0 の場合 : config.xml のサーバ Mbean でデフォルト ネイティブ コードセットとして utf-16/iso-8859-1 を指定する。

  • Borland Visibroker 5.0 の場合 : GIOP 1.2 を使用する。 GIOP のバージョンが含まれる完全な corbaloc url を使用する (Client -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:7001/NameService など)。

iiop.ejb.entity.tuxclient

複雑な valuetype を使用して WebLogic Server のエンティティ セッション Bean を呼び出す Tuxedo クライアントを提供する。

BEA IIOP

Tuxedo 8.x。 Tuxedo のライセンスは必要ない。

iiop.ejb.entity.server.wls

C++ クライアントまたは Tuxedo クライアントとエンティティ Bean の接続を例示する。

該当なし


iiop.ejb.stateless.cppclient

WebLogic Server のステートレス セッション Bean を呼び出す C++ CORBA クライアントを提供する。 また、WebLogic Tuxedo Connector を使用して Tuxedo サーバへの送信 RMI-IIOP 呼び出しを行う方法も例示する。

  • Borland Visibroker 4.1

  • Borland Visibroker 5.0

  • Borland Visibroker 4.1 の場合 : GIOP 1.0 プロトコルを使用する。 ユーザは DefaultGIOPMinorVersion 属性を追加し、config.xml のサーバ Mbean でその値を「1」に設定する必要がある。

  • Borland Visibroker 5.0 の場合 : config.xml のサーバ Mbean でデフォルト ネイティブ コードセットとして utf-16/iso-8859-1 を指定する。

  • Borland Visibroker 5.0 の場合 : GIOP 1.2 を使用する。 GIOP のバージョンが含まれる完全な corbaloc url を使用する (Client -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:7001/NameService など)。

iiop.ejb.stateless.rmiclient

WebLogic Server のステートレス セッション Bean を呼び出す RMI Java クライアントを提供する。 また、WebLogic Tuxedo Connector を使用して Tuxedo サーバへの送信 RMI-IIOP 呼び出しを行う方法も例示する。

JDK 1.3.1

JDK 1.3.1 では、セキュリティ ポリシー ファイルがないとサーバにアクセスできない。

iiop.ejb.stateless.sectuxclient

WebLogic のステートレス セッション Bean を呼び出すセキュアな Tuxedo クライアントを例示する。

BEA IIOP

Tuxedo 8.x。 Tuxedo のライセンスは必要ない。

iiop.ejb.stateless.server.tux

Tuxedo サーバを通じてさまざまなクライアント アプリケーションからステートレス セッション Bean を呼び出す方法を示す。 Tuxedo クライアントとの連携で、WebLogic Tuxedo Connector を使用したサーバ間の接続も例示する。

Tuxedo TGIOP

  • Tuxedo 8.x

  • WebLogic Tuxedo Connector を使用する場合は Tuxedo のライセンス

  • サーバ間接続を実現する WebLogic Tuxedo Connector。 「RMI/IIOP および CORBA を相互に運用する WebLogic Tuxedo Connector の使用」を参照。

iiop.ejb.stateless.server.wls

さまざまなクライアントを使用して、WebLogic Server で直接、または Tuxedo サーバを通じて間接的にステートレス EJB を呼び出す方法を例示する。

該当なし


iiop.ejb.stateless.tuxclient

WebLogic Server で直接ステートレス セッション Bean を呼び出すか、Tuxedo サーバを通じて WebLogic の同じステートレス セッション Bean を呼び出す Tuxedo クライアントを提供する。 また、WebLogic Tuxedo Connector を使用して Tuxedo サーバから WebLogic Server への送信 RMI-IIOP 呼び出しを行う方法も例示する。

BEA IIOP

Tuxedo 8.x。 Tuxedo のライセンスは必要ない。

iiop.rmi.cppclient

Tuxedo サーバまたは WebLogic Server のいずれかを呼び出す C++ クライアントを提供する。 WebLogic Tuxedo Connector を使用したサーバ間接続も例示します。

  • Borland Visibroker 4.1

  • Borland Visibroker 5.0

  • Orbix 2000

  • Borland Visibroker 4.1 の場合 : GIOP 1.0 プロトコルを使用する。 ユーザは DefaultGIOPMinorVersion 属性を追加し、config.xml のサーバ Mbean でその値を「1」に設定する必要がある。

  • Borland Visibroker 5.0 の場合 : config.xml のサーバ Mbean でデフォルト ネイティブ コードセットとして utf-16/iso-8859-1 を指定する。

  • Borland Visibroker 5.0 の場合 : GIOP 1.2 を使用する。 GIOP のバージョンが含まれる完全な corbaloc url を使用する (Client -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:7001/NameService など)。

iiop.rmi.rmiclient

WebLogic Server との接続を例示する RMI クライアントを提供する。 また、WebLogic Tuxedo Connector を使用して WebLogic Server から Tuxedo サーバへの送信呼び出しを行う方法も例示する。

該当なし

サーバにアクセスするにはセキュリティ ポリシー ファイルが必要。

iiop.rmi.server.tux

Tuxedo サーバを介したさまざまなクライアント アプリケーションからの接続を例示する。 Tuxedo クライアントとの連携で、WebLogic Tuxedo Connector を使用したサーバ間の接続も例示する。

Tuxedo TGIOP

  • Tuxedo 8.x

  • WebLogic Tuxedo Connector を使用する場合は Tuxedo のライセンス

iiop.rmi.server.wls

単純な Ping アプリケーションを使用したさまざまなクライアント、Tuxedo、および WebLogic Server 間の接続を例示する。

該当なし


iiop.rmi.tuxclient

Tuxedo サーバとの接続を例示する Tuxedo クライアントを提供する。

BEA IIOP

Tuxedo 8.x。 Tuxedo のライセンスは必要ない。

 


RMI-IIOP と RMI オブジェクトのライフサイクル

WebLogic Server のデフォルト ガベージ コレクションによって、未使用および未参照のサーバ オブジェクトのガベージ コレクションが行われます。 これにより、多数の未使用オブジェクトを実行することが原因でメモリが不足するおそれが小さくなります。 このポリシーでは、クライアントがリモート オブジェクトへの参照を保持しているものの、そのオブジェクトを約 6 分間呼び出してしない場合に、RMI-IIOP で NoSuchObjectException エラーが発生することがあります。 こうした例外は EJB、つまり JNDI などを経由してサーバ インスタンスによって参照される RMI オブジェクトの場合には発生しません。

RMI-IIOP の J2SE 仕様では、分散ガベージ コレクション (DGC) ではなく、javax.rmi.PortableRemoteObject に対して exportObject() および unexportObject() メソッドを使用して、RMI-IIOP 環境で RMI オブジェクトのライフサイクルを管理することを求めています。 ただし、exportObject() および unexportObject() は、WebLogic Server のデフォルト ガベージ コレクション ポリシーには影響はありません。 デフォルトのガベージ コレクション ポリシーを変更する場合は、BEA テクニカル サポートにお問い合わせください。

 

Back to Top Previous Next