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

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

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

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 を採用するためのモデルにはさまざまなものがあり、それらが提供する機能や標準の多くが共通しているので、どのモデルに従えばよいか見通しが立てにくいのが現状です。

クライアントのタイプと機能

次の表には、WebLogic Server 環境でサポートされるクライアントのタイプと、それぞれの特徴、機能、および制約についてまとめてあります。表では、RMI-IIOP の 2 種類だけでなく、T3 および CORBA クライアントの選択肢についても取り上げています。

表 2-1 WebLogic Server クライアントのタイプと機能

クライアント

タイプ

言語

プロトコル

クライアント クラス要件

主な機能

J2EE アプリケーション クライアント

(シン クライアント)

(WLS 8.1 で導入)

RMI

Java

IIOP

WLS シン クライアント jar

JDK 1.4

WLS クラスタ化をサポート。

セキュリティやトランザクションを始めとする J2EE のさまざまな機能をサポート。

SSL をサポート。

CORBA 2.4 ORB を使用。

T3

RMI

Java

T3

完全 WebLogic jar

WLS 固有の機能をサポート。

高速でスケーラビリティが高い。

CORBA との相互運用性はない。

J2SE

RMI

Java

IIOP

WebLogic クラスは不要

WLS 環境への接続を提供。

WLS 固有の機能をサポートしない。J2EE の多様な機能をサポートしない。

CORBA 2.3 ORB を使用。

WLInitialContextFactory は WebLogic Server 8.1 のクライアント用として非推奨。com.sun.jndi.cosnaming を利用。
CNCtxFactory が必要。

WLS-IIOP

(WLS 7.0 で導入)

RMI

Java

IIOP

完全 WebLogic jar

WLS 固有の機能をサポート。

SSL をサポート。

高速でスケーラビリティが高い。

非 ORB ベース。

CORBA/IDL

CORBA

OMG IDL からマップする言語 (C++、C、Smalltalk、COBOL など)

IIOP

WebLogic クラスは不要

CORBA 2.3 ORB を使用。

WLS 固有の機能をサポートしない。

Java をサポートしない。

C++ クライアント

CORBA

C++

IIOP

Tuxedo ライブラリ

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

SSL をサポート。

CORBA 2.3 ORB を使用。

Tuxedo サーバ

CORBA または RMI

OMG IDL からマップする言語 (C++、C、Smalltalk、COBOL など)

Tuxedo-
General-
Inter-Orb-Protocol

(TGIOP)

Tuxedo ライブラリ

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

CORBA 2.3 ORB を使用。


 

 


ORB 実装

WebLogic Server 8.1 では、独自の ORB 実装が提供されています。この ORB は、プログラムで ORB.init() が呼び出されるとき、または JNDI で "java:comp/ORB" がルックアップされるときにデフォルトでインスタンス化されます。WebLogic Server が J2SE 1.4 における CORBA サポートの仕様にどのように準拠するかについては、「WebLogic Server 8.1 での CORBA のサポート」を参照してください。

外部 ORB の使用

デフォルトの WebLogic Server 実装以外の ORB を使用するには、次のプロパティを設定します。

org.omg.CORBA.ORBSingletonClass=<classname>
org.omg.CORBA.ORBClass=<classname>

ORBSingletonClass はサーバのコマンドラインで設定する必要があります。ORBClass には、ORB.init() のプロパティ引数を設定できます。

外部 RMI-IIOP 実装の使用

別の RMI-IIOP 実装を使用するには、次の 2 つのプロパティを設定する必要があります。

javax.rmi.CORBA.UtilClass=<classname>
javax.rmi.CORBA.PortableRemoteObjectClass=<classname>

サーバの起動時に次のようなエラーが発生します。

<Sep 19, 2003 9:12:03 AM CDT> <Error> <IIOP> <BEA-002015> <Using javax.rmi.CORBA.UtilClass <classname>; The IIOP subsystem requires a WebLogic Server-compatible UtilClass.>
<Sep 19, 2003 9:12:03 AM CDT> <Error> <IIOP> <BEA-002016> <Using javax.rmi.CORBA.PortableRemoteObjectClass <classname>, the IIOP subsystem requires a WebLogic Server-compatible PortableRemoteObjectClass.>

WebLogic RMI-IIOP ランタイムは動作しないことを示しています。

これらのプロパティに対する J2SE のデフォルトは次のとおりです。

org.omg.CORBA.ORBSingletonClass=com.sun.corba.se.internal.corba.ORBSingleton
org.omg.CORBA.ORBClass=com.sun.corba.se.internal.Interceptors.PIORB
javax.rmi.CORBA.UtilClass=com.sun.corba.se.internal.POA.ShutdownUtilDelegate
javax.rmi.CORBA.PortableRemoteObjectClass=com.sun.corba.se.internal.javax.rmi.PortableRemoteObject

 


クライアントの開発

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

 


J2SE クライアントの開発

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

J2SE クライアントを使用すべき状況

J2SE クライアントは 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 です。

このクライアントは、J2EE ではなく J2SE に準拠しているので、エンタープライズレベルのアプリケーションで提供される多彩な機能をサポートしていません。アプリケーションの要件によっては、このクライアントは必要な機能を提供できない可能性があります。また、セキュリティ、トランザクション、JMS もサポートしていません。

J2SE クライアントの開発手順

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

  1. リモート オブジェクトのパブリック メソッドを、java.rmi.Remote を拡張するインタフェースに定義します。
  2. このリモート インタフェースには、コードをあまり記述する必要がない場合もあります。必要なのは、リモート クラスで実装するメソッドに対するメソッド シグネチャだけです。

  3. interfaceNameImpl というクラスにインタフェースを実装し、それを JNDI ツリー内にバインドしてクライアントから利用できるようにします。
  4. このクラスには、記述済みのリモート インタフェースを実装する必要があります。これは、インタフェースに含まれるメソッド シグネチャを実装したことを意味します。すべてのコード生成はこのクラスファイルに依存します。通常は、実装クラスを WebLogic 起動クラスとしてコンフィグレーションし、そのオブジェクトを JNDI ツリー内にバインドする main メソッドを組み込みます。

  5. リモート インタフェースと実装クラスを Java コンパイラでコンパイルします。RMI-IIOP アプリケーションでのこれらのクラスの開発は、通常の RMI での開発と同じです。RMI オブジェクトの開発の詳細については、「WebLogic RMI の機能とガイドライン」を参照してください。
  6. 実装クラスに対して WebLogic RMI または EJB コンパイラを実行して、必要な IIOP スタブを生成します。以下に示すように、IIOP スタブの生成に -iiop オプションを使用する必要はありません。
  7. $ java weblogic.rmic nameOfImplementationClass

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

  8. ここまでで作成したファイル、すなわち、リモート インタフェース、それを実装するクラス、およびスタブが WebLogic Server の CLASSPATH に含まれていることを確かめます。
  9. 初期コンテキストを取得します。
  10. RMI クライアントは、初期コンテキストを作成しオブジェクトをルックアップする (次の手順を参照) ことで、リモート オブジェクトにアクセスします。次に、このオブジェクトは適切な型にキャストされます。

    初期コンテキストの取得では、JNDI コンテキスト ファクトリを定義する際に com.sun.jndi.cosnaming.CNCtxFactory を使用する必要があります (WebLogic Server 8.1 では、WLInitialContextFactory はこのクライアント用として非推奨)。新しい InitialContext() にパラメータとして渡す「Context.INITIAL_CONTEXT_FACTORY」プロパティの値を設定する際には、com.sun.jndi.cosnaming.CNCtxFactory を使用します。

注意 : 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 ファイルがアプリケーションのクラスパス
* に存在するかどうかに依存する。詳細については、
* 『WebLogic JNDI プログラマーズ ガイド』を参照
private static Context getInitialContext()
  throws NamingException
{
  return new InitialContext();
}
  1. javax.rmi.PortableRemoteObject.narrow() メソッドと組み合わせてルックアップを実行するように、クライアントのコードを修正します。
  2. RMI over IIOP RMI クライアントが通常の RMI クライアントと異なるのは、初期コンテキストを取得する際にプロトコルとして IIOP が定義されるという点です。このため、ルックアップとキャストは、javax.rmi.PortableRemoteObject.narrow() メソッドと組み合わせて行われます。

    通常ならオブジェクトを特定のクラス型へキャストするような状況ではすべて、javax.rmi.PortableRemoteObject.narrow() メソッドを使用する必要があります。CORBA クライアントからは、リモート インタフェースを実装しないオブジェクトが返されることがあります。そのため、リモート インタフェースを実装するようオブジェクトを変換するために ORB から narrow メソッドが提供されます。たとえば、EJB ホームをルックアップしてその結果を 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";
  3. 以下のようなコマンドでクライアントを実行することで、IIOP を通じてクライアントをサーバに接続します。
  4. $ java -Djava.security.manager -Djava.security.policy=java.policy    examples.iiop.ejb.stateless.rmiclient.Client iiop://localhost:7001
  5. 以下のようにして、クライアント側にセキュリティ マネージャを設定します。
  6. 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;

    }

 


J2EE アプリケーション クライアント (シン クライアント) の開発

J2EE アプリケーション クライアントはクライアント マシン上で実行され、マークアップ言語で得られるよりも豊富なユーザ インタフェースを提供できます。アプリケーション クライアントはビジネス層で実行されているエンタープライズ Bean に直接アクセスし、適宜 HTTP を介して Web 層で実行されているサーブレットと通信できます。一般に、アプリケーション クライアントはサーバからダウンロードされますが、クライアント マシン上にインストールすることもできます。

J2EE アプリケーション クライアントは Java アプリケーションですが、J2EE コンポーネントであるため、スタンドアロンの Java アプリケーション クライアントとは異なります。具体的には、他の J2EE 準拠のサーバへ移植できるという利点があり、J2EE サービスにアクセスできます。

WebLogic Server アプリケーション クライアントは、標準クライアントと JMS クライアントとして用意され、2 つの独立した jar ファイル (wlclient.jarwljmsclient.jar) にパッケージ化されて WebLogic Server インストール ディレクトリの WL_HOME/server/lib サブディレクトリに存在します。各 jar は約 400KB です。

シン クライアントは RMI-IIOP プロトコル スタックに基づいており、J2SE 1.4 の新機能を活用しています。また、JDK ORB のサポートも必要です。シン クライアントは JRE 1.4 の以前のリリースでも動作しますが、JRE 1.4.2_04 以降を使用することをお勧めします。RMI リクエストの作成は基本的に JDK によって処理されるため、非常に小さいクライアントを実現できます。クライアントサイドの開発には、WebLogic Server API ではなく標準の J2EE API を使用します。

シン クライアント アプリケーションの開発プロセスは、他の J2EE アプリケーションを開発する場合と同じです。クライアントは InitialContext、UserTransaction、EJB などの標準 J2EE アーティファクトを活用できます。WebLogic Server シン クライアントは、URL のプロトコル部分の値として iiop、iiops、http、https、t3、および t3s をサポートしています。各々、InitialContext で異なる URL を使うことで選択できます。URL に関係なく、IIOP は必ず使用されます。URL に t3 を指定すると iiop が使用され、t3s を指定すると iiops が使用されます。http は iiop 上を、https は iiops 上をトンネリングされます。

サーバサイド コンポーネントは、通常の方法でデプロイされます。クライアント スタブは、デプロイ時または実行時に生成できます。デプロイ時にスタブを生成するには、-iiop および -basicClientJar オプションを付けて appc を実行し、シン クライアントでの使用に適したクライアント jar を作成します。この手順を実行しない場合、WebLogic Server が必要に応じて実行時にスタブを生成し、クライアントに提供します。クライアントがスタブをダウンロードするには、適切なセキュリティ マネージャがインストールされている必要があります。シン クライアントは、デフォルトの軽量セキュリティ マネージャを提供します。強固なセキュリティが必要な場合は、コマンドライン オプションの -Djava.security.manager -Djava.security.policy==policyfile を使用して、別のセキュリティ マネージャをインストールできます。アプレットは、スタブのダウンロードを可能にする別のセキュリティ マネージャを使用します。

シン クライアント jar では、完全 jar とシン クライアント jar の両方が CLASSPATH にあった場合に、weblogic.jar 内のクラスをいくつか置き換えて、シン クライアント jar がパス内で先になるようにします。ただし、シン クライアントのサポートに weblogic.jar は必須ではありません。必要な場合は、次の構文に従って、明示的に CLASSPATH を指定して実行できます。

java -classpath "<WL_HOME>/lib/wlclient.jar;<CLIENT_CLASSES>" your.app.Main

注意 : wljmsclient.jarwlclient.jar を参照するので、CLASSPATH にはどちらか一方の jar を指定するだけでかまいません。

シン クライアント jar をサーバサイドの CLASSPATH に入れないでください。

シン クライアント jar には、javax.ejb などの必要な J2EE インタフェース クラスが用意されているので、クライアントにその他の jar ファイルは必要ありません。

J2EE アプリケーション クライアント (シン クライアント) の開発手順

J2EE アプリケーション クライアントを開発するには、以下の手順に従います。

  1. リモート オブジェクトのパブリック メソッドを、java.rmi.Remote を拡張するインタフェースに定義します。
  2. このリモート インタフェースには、コードをあまり記述する必要がない場合もあります。必要なのは、リモート クラスで実装するメソッドに対するメソッド シグネチャだけです。

  3. interfaceNameImpl というクラスにインタフェースを実装し、それを JNDI ツリー内にバインドしてクライアントから利用できるようにします。
  4. このクラスには、記述済みのリモート インタフェースを実装する必要があります。これは、インタフェースに含まれるメソッド シグネチャを実装したことを意味します。すべてのコード生成はこのクラスファイルに依存します。通常は、実装クラスを 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);
    }
  5. リモート インタフェースと実装クラスを Java コンパイラでコンパイルします。RMI-IIOP アプリケーションでのこれらのクラスの開発は、通常の RMI での開発と同じです。RMI オブジェクトの開発の詳細については、「WebLogic RMI の機能とガイドライン」を参照してください。
  6. 実装クラスに対して WebLogic RMI または EJB コンパイラを実行して、必要な IIOP スタブを生成します。

注意 : スタブをダウンロードする場合は、rmic を実行する必要はありません。

$ java weblogic.rmic -iiop nameOfImplementationClass

デプロイ時にスタブを生成するには、-iiop および -clientJar オプションを付けて appc を実行し、シン クライアントでの使用に適したクライアント jar を作成します。この手順を実行しない場合、WebLogic Server が必要に応じて実行時にスタブを生成し、クライアントに提供します。

スタブはリモート オブジェクト用のクライアントサイド プロキシで、個々の WebLogic RMI 呼び出しを対応するサーバサイド スケルトンに転送します。今度は、サーバサイド スケルトンが、その呼び出しを実際のリモート オブジェクト実装に転送します。

  1. ここまでで作成したファイル、すなわち、リモート インタフェース、それを実装するクラス、およびスタブが WebLogic Server の CLASSPATH に含まれていることを確かめます。
  2. 初期コンテキストを取得します。
  3. RMI クライアントは、初期コンテキストを作成しオブジェクトをルックアップする (次の手順を参照) ことで、リモート オブジェクトにアクセスします。次に、このオブジェクトは適切な型にキャストされます。

    初期コンテキストの取得では、JNDI コンテキスト ファクトリを定義する際に weblogic.jndi.WLInitialContextFactory を使用する必要があります。新しい InitialContext() にパラメータとして渡す「Context.INITIAL_CONTEXT_FACTORY」プロパティの値を設定する際には、このクラスを使用します。

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

    通常ならオブジェクトを特定のクラス型へキャストするような状況ではすべて、javax.rmi.PortableRemoteObject.narrow() メソッドを使用する必要があります。CORBA クライアントからは、リモート インタフェースを実装しないオブジェクトが返されることがあります。そのため、リモート インタフェースを実装するようオブジェクトを変換するために ORB から narrow メソッドが提供されます。たとえば、EJB ホームをルックアップしてその結果を 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,
    "weblogic.jndi.WLInitialContextFactory");
    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";
  6. 以下のようなコマンドでクライアントを実行することで、IIOP を通じてクライアントをサーバに接続します。
  7. $ java -Djava.security.manager -Djava.security.policy=java.policy    examples.iiop.ejb.stateless.rmiclient.Client iiop://localhost:7001

 


セキュリティ対応クライアントの開発

JAAS (Java Authentication and Authorization Service) およびセキュア ソケット レイヤ (SSL) を使用する Weblogic クライアントを開発できます。

JAAS を使用するクライアントの開発

JAAS は、ユーザ ID に基づくアクセス制御機能を提供します。WebLogic Server クライアントの認証方法としては、より望ましい選択肢です。一般には、ファイルの読み込みや書き込みの認証方法として使用します。クライアントの証明書認証 (双方向 SSL 認証) が必要な場合は JNDI 認証を使用します。JAAS 認証の実装方法の詳細については、「Java クライアントでの JAAS 認証の使用」を参照してください。

シン クライアントで JAAS を使用する際の制約

WebLogic シン クライアント アプリケーションでの JAAS 認証は以下のクラスでのみサポートされます。

SSL を使用するクライアントの開発

BEA WebLogic Server では、WebLogic Server クライアントとサーバ、Java クライアント、Web ブラウザ、および他のサーバの間で転送されるデータを暗号化するためにセキュア ソケット レイヤ (SSL) がサポートされています。

すべての SSL クライアントは、信頼を指定する必要があります。信頼は、どの信頼性のある認証局がクライアントから信頼されるのかを指定する CA 証明書の集合です。SSL 接続を確立するためには、RMI クライアントはサーバのデジタル証明書を発行した認証局を信頼する必要があります。サーバの信頼性のある CA 証明書の場所は、RMI クライアントを起動する際に指定します。

デフォルトでは、JDK (...\jre\lib\security\cacerts) で利用できる信頼性のあるすべての認証局が RMI クライアントから信頼されます。サーバの信頼性のある CA 証明書がこのキーストアに格納されている場合は、何も設定する必要はありません。また、サーバの信頼性のある CA 証明書は、以下のタイプの信頼キーストアに格納することもできます。

サーバサイド SSL の実装方法の詳細については、「SSL を使用した RMI over IIOP のコンフィグレーション」を参照してください。

シン クライアントで SSL を使用する際の制約

WebLogic シン クライアントでは、双方向 SSL のみがサポートされます。双方向 SSL には、SECURITY_CREDENTIALS プロパティに指定されている SSLContext が必要です。例として、次のクライアント コードを参照してください。

.
.
.
// KeyManager の KeyManagerFactory を取得する
System.out.println("Retrieving KeyManagerFactory & initializing");
    KeyManagerFactory kmf =     KeyManagerFactory.getInstance("SunX509","SunJSSE");
    kmf.init(ks,keyStorePassword);

// SSLContext を取得して初期化する
System.out.println("Initializing the SSLContext");
    SSLContext sslCtx = SSLContext.getInstance("SSL");
    sslCtx.init(kmf.getKeyManagers(),null,null);

// SSLContext を初期コンテキスト ファクトリに渡し、InitialContext
// を取得する
System.out.println("Getting initial context");
    Hashtable props = new Hashtable();      props.put(Context.INITIAL_CONTEXT_FACTORY,
        "weblogic.jndi.WLInitialContextFactory");
    props.put(Context.PROVIDER_URL,
        "corbaloc:iiops:" +
         host + ":" + port +
        "/NameService");
    props.put(Context.SECURITY_PRINCIPAL,"weblogic");
    props.put(Context.SECURITY_CREDENTIALS, sslCtx);
    Context ctx = new InitialContext(props);
.
.
.

セキュリティのコード例

WebLogic Server 製品には、セキュリティのサンプルが用意されています。これらのサンプルは、SAMPLES_HOME\server\examples\src\examples\security ディレクトリにあります。各サンプルの説明と、サンプルをビルド、コンフィグレーション、実行する方法については、package-summary.html ファイルを参照してください。これらのコード サンプルは、変更して再利用できます。

 


WLS-IIOP クライアントの開発

WebLogic Server では、WLS-IIOP クライアントという「ファット」RMI-IIOP クライアントをサポートされています。また、WLS-IIOP クライアントではクラスタ化がサポートされています。

WLS-IIOP クライアントをサポートするには、以下を行う必要があります。

上記以外の WLS-IIOP の開発手順は、「J2SE クライアントの開発」で説明した手順と同じです。

注意 : WebLogic Server 8.1 では、クライアントの起動時に -D weblogic.system.iiop.enableClient=true コマンドライン オプションを使用して、クライアント アクセスを有効にする必要はありません。
weblogic.jar を使用する場合、enableClient はデフォルトで true に設定されています。

 


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

CORBA/IDL クライアントを使用した RMI over IIOP (CORBA/IDL クライアント使用型 RMI over IIOP) には、ORB (Object Request Broker) と共に、IDL と呼ばれる相互運用のための言語を作成するコンパイラが必要になります。C、C++、COBOL などは、ORB で IDL にコンパイル可能な言語の例です。CORBA のプログラマは、CORBA インタフェース定義言語 (IDL : Interface Definition Language) のインタフェースを使用して、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 コードを作成することも可能ですが、それは難しく、多数のバグを発生させることになるので、WebLogic ではお勧めしません。

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

図 2-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 サービスが実装されています。

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

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

表 2-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 の詳細については、「オブジェクトの値渡しに関する制約」を参照してください。

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

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

  1. J2SE クライアントの開発手順」の手順 1 ~ 3 を実行します。
  2. -idl オプションを付けて「WebLogic RMI コンパイラ」または「WebLogic EJB コンパイラ」を実行することで、IDL ファイルを生成します。
  3. IDL ファイルをコンパイルすると、必要なスタブ クラスが生成されます。CORBA/IDL クライアントがエンタープライズ Bean オブジェクトにアクセスする方法の詳細については、「RMI-IIOP での EJB の使用 」を参照してください。また、Java IDL 仕様については、「Java 言語の OMG 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 クライアントでリモート クラスと通信するのに必要なスタブ クラスを作成します。ORB ベンダによって IDL コンパイラが提供されます。
  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.

 


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 Evaluation Center から入手できます。

WebLogic C++ クライアントの動作

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

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

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

  1. C++ クライアントと相互運用する EJB を、ejbc コンパイラで -idl オプションを指定してコンパイルします。これにより、EJB の IDL スクリプトが生成されます。
  2. C++ IDL コンパイラを使用して IDL スクリプトをコンパイルし、CORBA クライアント スタブ、サーバ スケルトン、およびヘッダ ファイルを生成します。C++ IDL コンパイラの使用方法については、「OMG IDL 構文と C++ IDL コンパイラ」を参照してください。
  3. EJB がサーバサイド実装を表現したら、サーバ スケルトンを破棄します。
  4. EJB を CORBA オブジェクトとして実装する C++ クライアントを作成します。CORBA クライアント アプリケーションの作成方法の概要については、「CORBA クライアント・アプリケーションの開発方法」を参照してください。
  5. Tuxedo の buildobjclient コマンドを使用してクライアントをビルドします。

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

C++ クライアントには、次のような制限があります。

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

WebLogic Server 製品には、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 の使用を検討してください。スケーラビリティと信頼性の高い 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 ファイルを参照してください。これらのコード サンプルは、変更して再利用できます。

 


CORBA API の使用

WLS 8.1 では、RMI-IIOP ランタイムが拡張され、すべての CORBA オブジェクト タイプ (RMI 値タイプではなく) と CORBA スタブをサポートするようになりました。この拡張では次のような機能が提供されます。

以下の節では、CORBA API の使用方法について説明します。

発信 CORBA 呼び出しのサポート

この節では、発信呼び出し用に CORAB API を使用する顧客向けに、典型的な開発モデルを実装する方法について説明します。

  1. JDK の IDL コンパイラである idlj を使用して、IDL から CORBA スタブを生成します。
  2. javac を使用してスタブをコンパイルします。
  3. jar 内の生成済みスタブを含む EJB をビルドします。
  4. JNDI でホストされる WebLogic ORB を使用して、外部サービスを参照します。

JNDI でホストされる WebLogic ORB の使用

この節では、WebLogic ORB にアクセスするいくつかのメカニズムの例を示します。これらのメカニズムは同じ効果を持つので、ある程度はそれらの構成要素を混ぜ合わせることができます。narrow() で返されるオブジェクトは、外部 ORB サービスを表す CORBA スタブであり、通常の CORBA 参照で呼び出せます。以下の各コード サンプルでは、CORBA インタフェースは MySvc、サービスは exthost:extport にある外部 ORB の CosNaming サービスの「where」でホストされるものとします。

JNDI から ORB

.
.
.ORB orb = (ORB)new InitialContext().lookup("java:comp/ORB");
NamingContext nc = NamingContextHelper.narrow(orb.string_to_object("corbaloc:iiop:exthost:extport/NameService"));
MySvc svc = MySvcHelper.narrow( nc.resolve(new NameComponent[] { new NameComponent("where", "")}));
.
.
.

ORB を直接作成

.
.
.
ORB orb = ORB.init();
MySvc svc = MySvcHelper.narrow(orb.string_to_object("corbaname:iiop:exthost:extport#where"));
.
.
.

JNDI を使用

.
.
.
MySvc svc = MySvcHelper.narrow(new InitialContext().lookup("corbaname:iiop:exthost:extport#where"));
.
.
.

WebLogic ORB では、DII (Dynamic Invocation Interface) を含むほとんどのクライアント ORB 機能がサポートされます。そのためには、外部 ORB をサーバ内でインスタンス化してはなりません。インスタンス化すると、WebLogic ORB による統合メリットを活かせなくなります。

着信 CORBA 呼び出しのサポート

WebLogic 8.1 では、サーバ内で ORB をホストする以外の方法として、着信 CORBA 呼び出しの基本サポートも提供されます。それには、ORB.connect() を使用して、WebLogic Server 内で CORBA サーバをパブリッシュします。この方法としては、CORBA インタフェースを実装する RMI オブジェクトを記述するのが最も簡単です。上記の MySVC サンプルを利用します。

.
.
.
class MySvcImpl implements MvSvcOperations, Remote
{
        public void do_something_remote() {}
        public static main() {
                MySvc svc = new MySvcTie(this);
                InitialContext ic = new InitialContext();
                ((ORB)ic.lookup("java:comp/ORB")).connect(svc);
                ic.bind("where", svc);
        }
}
.
.
.

起動クラスとして登録すると、CORBA サービスは、場所「where」にある WebLogic Server の CosNaming サービスで使用できるようになります。

CORBA API を使用する際の制約

CORBA オブジェクト タイプのサポートには以下の制約があります。

 


RMI-IIOP での EJB の使用

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

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

weblogic.appc ユーティリティでは、さまざまなコマンド修飾子がサポートされています。「CORBA/IDL クライアントの開発手順」を参照してください。

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

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

> java weblogic.appc -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.appc を使用して作成した 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/examples/src/examples/iiop ディレクトリに入っています。

 


コード例

WL_HOME/samples/examples/iiop ディレクトリに examples.iiop パッケージがあり、その中にさまざまなクライアントとアプリケーションとの接続方法を示すサンプルが用意されています。RMI-IIOP での EJB の使用、C++ クライアントへの接続、Tuxedo Server との相互運用性の設定などを扱ったサンプルが含まれています。詳細については、サンプルの説明を参照してください。特に WebLogic Tuxedo Connector に関するサンプルについては、/wlserver8.1/samples/examples/wtc ディレクトリを参照してください。

パッケージ化された IIOP サンプル

次の表に、WebLogic Server 8.1 用の RMI-IIOP サンプルについての情報をまとめます。

表 2-3 WebLogic Server 8.1 IIOP サンプル

サンプル

ORB/プロトコル

要件

iiop.ejb.entity.cppclient

WebLogic Server 内のエンティティ セッション Bean を呼び出す C++ クライアントのサンプル。

Borland Visibroker 5.2

  • WebLogic 8.1 SP3 以降ではサポートされていない。

  • config.xml ファイルの Server MBean で、デフォルトのネイティブ コードセットとして utf-16/iso-8859-1 を指定する。

  • GIOP 1.2 を使用する。Client -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:7001/NameService などの GIOP バージョンを含む完全な corbaloc URL を使用する。

iiop.ejb.entity.tuxclient

WebLogic Server 内のエンティティ セッション Bean を複合的な値タイプを使用して呼び出す Tuxedo クライアントのサンプル。

BEA IIOP

  • Tuxedo 8.x。Tuxedo ライセンスは不要。

  • Weblogic 8.1 SP3 以降では、ベクトル クラスのカスタム マーシャリングが必要。

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 5.2

  • WebLogic 8.1 SP3 以降ではサポートされていない。

  • config.xml ファイルの Server MBean で、デフォルトのネイティブ コードセットとして utf-16/iso-8859-1 を指定する。

  • GIOP 1.2 を使用する。Client -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:7001/NameService などの GIOP バージョンを含む完全な corbaloc URL を使用する。

iiop.ejb.stateless.rmiclient

WebLogic Server 内のステートレス セッション Bean を呼び出す RMI Java クライアントのサンプル。WebLogic Tuxedo Connector を使用して Tuxedo サーバに対する発信 RMI-IIOP 呼び出しを行う方法も示す。

JDK 1.4

JDK 1.4 では、サーバにアクセスするためのセキュリティ ポリシー ファイルが必要。

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 ライセンスが必要。

iiop.ejb.stateless.server.wls

さまざまなクライアントを使用して、ステートレス EJB を WebLogic Server で直接呼び出す方法、および Tuxedo サーバ経由で間接的に呼び出す方法を示すサンプル。

該当なし


iiop.ejb.stateless.tuxclient

ステートレス セッション Bean を WebLogic Server で直接呼び出す Tuxedo クライアント、および WebLogic 内の同じステートレス セッション Bean を Tuxedo サーバ経由で呼び出す Tuxedo クライアントのサンプル。WebLogic Tuxedo Connector を使用して、Tuxedo サーバから WebLogic Server に対し発信 RMI-IIOP 呼び出しを行う方法も示す。

BEA IIOP

Tuxedo 8.x。Tuxedo ライセンスは不要。

iiop.ejb.stateless.txtuxclient

トランザクションを使用してステートレス セッション Bean を呼び出す Tuxedo クライアントのサンプル。

BEA IIOP

Tuxedo 8.x。Tuxedo ライセンスは不要。

その他の IIOP サンプル

次の表に、dev2dev コードライブラリで提供される WebLogic Server 8.1 用のその他の RMI-IIOP サンプルについての情報をまとめます。

表 2-4 WebLogic Server 8.1 IIOP dev2dev サンプル

サンプル

ORB/プロトコル

要件

iiop.rmi.corbaclient

WebLogic Server への接続方法の説明に使用できる CORBA クライアントのサンプル。

BEA IIOP

  • Tuxedo 8.0 RP56 以降、または Tuxedo 8.1。Tuxedo ライセンスは不要。

  • JDK 1.4 では、サーバにアクセスするためのセキュリティ ポリシー ファイルが必要。

iiop.rmi.cppclient

Tuxedo サーバまたは WebLogic Server を呼び出す C++ クライアントのサンプル。WebLogic Tuxedo Connector を使用したサーバ間接続の方法についても示す。

  • Borland Visibroker 5.2

  • Orbix 2000

  • WebLogic 81 SP3 以降ではサポートされていない。

  • Borland Visibroker 5.2 では、config.xml ファイルの Server MBean で、デフォルトのネイティブ コードセットとして utf-16/iso-8859-1 を指定する。

  • Borland Visibroker 5.2 では GIOP 1.2 を使用する。Client -ORBInitRef NameService=corbaloc:iiop:1.2@localhost:7001/NameService などの GIOP バージョンを含む完全な corbaloc URL を使用する。

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 仕様では、javax.rmi.PortableRemoteObjectexportObject() および unexportObject() メソッドを使用して、DGC (Distributed Garbage Collection) ではなく、RMI-IIOP 環境で RMI オブジェクトのライフサイクルを管理することが求められています。ただし、exportObject() および unexportObject() は WebLogic Server のデフォルトのガベージ コレクション方法にはまったく影響しません。デフォルト ガベージ コレクション方法を変更する場合は、BEA テクニカルサポートに連絡してください。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次