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

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

 Previous Next Contents PDF で侮ヲ  

WebLogic Server の RMI-IIOP 用コンフィグレーション

以下の各節では、WebLogic Server の RMI-IIOP 用コンフィグレーションに関する概念と手続きについて説明します。

 


コンフィグレーションの概要

CORBA クライアントからクライアント ID を伝達するための十分な標準規格が存在しないため、IIOP を通じて WebLogic Server に接続するすべてのクライアントの ID は、デフォルトで「guest」になります。以下の例に示すように、config.xml ファイルにユーザ名とパスワードを設定することで、IIOP を通じて WebLogic Server の個々のインスタンスに接続するすべてのクライアント用に単一の ID をセットアップすることができます。

<Server
Name="myserver"
NativeIOEnabled="true"
DefaultIIOPUser="Bob"
DefaultIIOPPassword="Gumby1234"
ListenPort="7001">

また、config.xml には IIOPEnabled 属性を設定することもできます。これのデフォルト値は "true" で、IIOP のサポートを無効にする場合にかぎり、これを "false" に設定します。すべてのリモート オブジェクトが JNDI ツリーにバインドされて、クライアントからアクセスできるようになることが保証されている限り、RMI over IIOP を使用するために、WebLogic Server を特別にコンフィグレーションする必要はありません。RMI オブジェクトは通常、起動クラスによって JNDI ツリーにバインドされます。EJBean ホームは、デプロイメント時に JNDI ツリーにバインドされます。WebLogic Server は、JNDI ツリーのルックアップ呼び出しをすべて委託することにより、CosNaming Service サービスを実装します。

WebLogic Server 7.0 では、corbaname および corbaloc の各 RMI-IIOP JNDI 参照をサポートしています。 CORBA/IIOP 2.4.2 仕様を参照してください。これらの参照の特徴の 1 つは、ある WebLogic Server をホストとする EJB などのオブジェクトを他のアプリケーション サーバから IIOP を通じて利用できるようにすることが可能になるということです。そのため、たとえば、ejb-jar.xml に以下を追加することもできます。

<ejb-reference-description>
<ejb-ref-name>WLS</ejb-ref-name>
<jndi-name>corbaname:iiop:1.2@localhost:7001#ejb/j2ee/interop/foo</jndi-name>
</ejb-reference-description>

reference-description スタンザは、ejb-jar.xml に定義されているリソース参照を WebLogic Server 内に用意されている実際のリソースの JNDI 名にマップするものです。ejb-ref-name ではリソース参照名を指定します。これは、EJB プロバイダによって ejb-jar.xml デプロイメント記述子ファイル内に記載される参照です。jndi-name では、WebLogic Server に用意されている実際のリソース ファクトリの JNDI 名を指定します。

iiop:1.2 は、<jndi-name> セクションに含まれています。WebLogic Server 7.0 には、GIOP (General-Inter-Orb-Protocol) 1.2 の実装が用意されています。GIOP は、相互運用する ORB 間で交換されるメッセージのフォーマットを規定するものです。これによって、他の多数の ORB やアプリケーション サーバとの相互運用が可能になります。GIOP のバージョンは、corbaname または corbaloc 参照内のバージョン番号で指定することができます。

 


RMI over IIOP と SSL の併用

セキュア ソケット レイヤ (SSL) プロトコルを使用すれば、RMI または EJB リモート オブジェクトへの IIOP 接続を保護することができます。SSL プロトコルでは、認証を通じて接続の安全性を確保し、オブジェクト間で交換されるデータを暗号化します。WebLogic Server では、以下の方法で RMI over IIOP と SSL を併用することができます。

どちらの場合も、まず、WebLogic Server をコンフィグレーションして SSL プロトコルを使えるようにする必要があります。 詳細については、「SSL のコンフィグレーション」を参照してください。

RMI-IIOP と SSL および Java クライアントの併用

  1. コールバックを使用する場合には、Java クライアントのプライベート キーとデジタル証明書を取得します。 詳細については、「SSL のコンフィグレーション」を参照してください。

  2. -d オプションを付けて、ejbc コンパイラを実行します。

  3. RMI クライアントを起動する場合は、下記のコマンド オプションを使用します。マシン名、通常のポート、および SSL ポートを指定する必要があります。また、以下のように、weblogic.corba.orb.ssl.ORB クラスを使用する必要もあります。このクラスは、ORB 自身のクラスをラップし、JDK でセキュアな接続を処理する際の問題を解決するものです。

    java -Dweblogic.security.SSL.ignoreHostnameVerification=true ¥
    -Dweblogic.SSL.ListenPorts=localhost:7701:7702 ¥
    -Dorg.omg.CORBA.ORBClass=weblogic.corba.orb.ssl.ORB ¥
    weblogic.rmiiiop.HelloJDKClient iiop://localhost:7702

    *

    * または、クライアント接続に対して証明書チェーンを使用するには :

    *

*java -Dweblogic.corba.orb.ssl.certs=myserver/democert.pem -Dweblogic.corba.orb.ssl.key=myserver/demokey.pem -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.corba.orb.ssl.ListenPorts=localhost:7701:7702 -Dorg.omg.CORBA.ORBClass=weblogic.corba.orb.ssl.ORB -Djava.security.manager -Djava.security.policy==java.policy -ms32m -mx32m weblogic.rmiiop.HelloJDKClient port=7702

-Dssl.certs=Java クライアントのデジタル証明書のディレクトリ位置
-Dssl.key=Java クライアントのプライベート キーのディレクトリ位置

4. WebLogic Server で使用される SSL プロトコル用のクラスを Java クライアントの CLASSPATH に追加します。

着信接続の場合 (WebLogic Server から Java クライアントへのコールバック用の接続) には、Java クライアントのデジタル証明書とプライベート キーをコマンドラインで指定します。ssl.certs および ssl.key というコマンドライン オプションを使用して、この情報を入力します。 詳細については、「SSL のコンフィグレーション」を参照してください。

BEA Tuxedo クライアントでの SSL プロトコルの使用

SSL プロトコルを使用して BEA Tuxedo クライアントと WebLogic Server 間の通信を保護する方法については、「BEA Tuxedo クライアントおよび WebLogic Server での SSL プロトコルの使用」を参照してください。

 


委託を通じた CORBA クライアントからオブジェクトへのアクセス

WebLogic Server には、CORBA クライアントから RMI リモート オブジェクトにアクセスできるようにするサービスが用意されています。また、それ以外の方法として、WebLogic Server に CORBA ORB (Object Request Broker) をホストし、発着信メッセージをその ORB に委託することで、サーバ内でバインド可能なあらゆるオブジェクトを CORBA クライアントから間接的に呼び出せるようにすることもできます。

委託の概要

WebLogic Server をホストとするオブジェクトに CORBA 呼び出しを委託するには、いくつかのオブジェクトが連携してそれを実行する必要があります。それらのオブジェクトを作成する主な手順を以下に示します。

  1. WebLogic Server を実行している JVM と共存するように ORB を作成し初期化する起動クラスを作成します。

  2. その ORB から着信するメッセージを受け付けるオブジェクトを作成するための IDL (インタフェース定義言語) を作成します。

  3. その IDL をコンパイルします。これによって多数のクラスが生成されますが、そのうちの 1 つが Tie クラスです。Tie クラスは、着信呼び出しを処理するためにサーバサイドで用いられ、それらの呼び出しをしかるべき実装クラスにディスパッチします。その実装クラスは、CORBA クライアントに代わって、サーバの接続、適切なオブジェクトのルックアップ、およびそのオブジェクトに対するメソッドの呼び出しを行います。

次の図には、サーバに接続して EJBean 上で動作する実装クラスに、EJBean の呼び出しを委託する CORBA クライアントを示します。同様のアーキテクチャを使用すると、これとは逆の状況でも機能します。起動クラスを使用すると、ORB を起動し、対象となる CORBA 実装オブジェクトへの参照を取得できます。このクラスは、JNDI ツリー内の別の WebLogic オブジェクトで使用できるようにして、CORBA オブジェクトへの適切な呼び出しを委託することも可能です。


 

委託の例

以下のサンプル コードでは、サーバへの接続、JNDI ツリー内の Foo オブジェクトのルックアップ、および bar メソッドの呼び出しを行う実装クラスを作成しています。このオブジェクトはまた、以下の処理による CORBA 環境の初期化を行う起動クラスでもあります。

import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import java.rmi.*;
import javax.naming.*;
import weblogic.jndi.Environment;
public class FooImpl implements Foo
{ 
public FooImpl() throws RemoteException {
super();
  }
  public void bar() throws RemoteException, NamingException {
// 呼び出しの委託先となるインスタンスをルックアップして呼び出す
weblogic.jndi.Environment env = new Environment();
Context ctx = env.getInitialContext();
Foo delegate = (Foo)ctx.lookup("Foo");
delegate.bar();
System.out.println("delegate Foo.bar called!");
  }
  public static void main(String args[]) {
try {
FooImpl foo = new FooImpl();
      // ORB を作成し初期化する
ORB orb = ORB.init(args, null);
      // Tie オブジェクトを作成し、ORB に登録する
_FooImpl_Tie fooTie = new _FooImpl_Tie();
fooTie.setTarget(foo);
orb.connect(fooTie);
      // ネーミング コンテキストを取得する
org.omg.CORBA.Object o = ¥
orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(o);
      // オブジェクト参照をネーミング サービスにバインドする
      NameComponent nc = new NameComponent("Foo", "");
NameComponent path[] = {nc};
ncRef.rebind(path, fooTie);
      System.out.println("FooImpl created and bound in the ORB       registry.");
    }
catch (Exception e) {
System.out.println("FooImpl.main: an exception occurred:");
e.printStackTrace();
    }
  }
}

起動クラスの実装方法の詳細については、「WebLogic Server の起動と停止」を参照してください。

 


ハードウェア ロード バランサと RMI over IIOP の併用

注意: この機能は、ハードウェア ロード バランサを使用してブートストラップを行っている場合にのみ正常に動作します。

サービス パック 5 以降の WebLogic Server 7.0 BEA ORB を拡張すると、ブートストラップ時の再接続の強制によるハードウェア ロード バランシングをサポートできます。 これにより、ハードウェア ロード バランサによる接続試行のバランシングが可能になります。

ほとんどの場合、いったん接続が確立されると、元の接続を使用して次の NameService ルックアップが実行されます。 しかし、この機能はハードウェア ロード バランサにエンド ポイントの再ネゴシエーションを強制するため、既存の接続で処理中のリクエストはすべて破棄されます。

-Dweblogic.system.iiop.reconnectOnBootstrap システム プロパティを使用すると、BEA ORB の接続動作を設定できます。 有効な値は、次のとおりです。

ハードウェア ロード バランサを必要とする環境では、このプロパティを true に設定する必要があります。

 


WebLogic RMI-IIOP の制約事項

以下の各節では、WebLogic RMI-IIOP に関するさまざまな問題点の概要を説明します。

サーバで RMI-IIOP を使用する際の制約

サーバで RMI-IIOP を使用する場合は、以下の制約に注意してください。

クライアントで RMI-IIOP を使用する際の制約

WebLogic Server と一緒に使用する JDK は、バージョン 1.3.1_01 またはそれ以降でなければなりません。それ以前のバージョンは RMI-IIOP に準拠していません。これら旧バージョンの JDK には以下の問題点があることに注意してください。

これらの多くは、両方でサポートすることが不可能なものです。選択肢がいくつかある場合には、WebLogic では仕様に準拠する方をサポートしています。

Java IDL クライアントの開発上の制約

RMI-IIOP を使用する予定であれば、RMI クライアント モデルを用いて Java クライアントを開発することを強くお勧めします。Java IDL クライアントを開発する場合には、名前の衝突やクラスパスの問題が発生するおそれがあり、サーバサイドとクライアントサイドのクラスを分離しておく必要があります。 RMI オブジェクトと IDL クライアントのタイプ システムはそれぞれ異なるので、サーバサイドのインタフェースを定義するクラスは、クライアントサイドのインタフェースを定義するクラスとは非常に異なるものになります。

オブジェクトの値渡しに関する制約

オブジェクトを値で渡すには、値タイプを使用する必要があります(詳細については、CORBA/IIOP 2.4.2 仕様の第 5 章を参照してください)。値タイプ は、それが定義または参照されるプラットフォームごとに実装されます。この節では、WebLogic Server 上のエンティティ Bean にアクセスする C++ クライアントのケースを具体的に取り上げながら、複合的な値タイプを渡す際の問題点について説明します (SAMPLES_HOME/server/src/examples/iiop/ejb/entity/server/wls ディレクトリと SAMPLES_HOME/server/src/examples/iiop/ejb/entity/cppclient ディレクトリを参照してください)。

Java プログラマが直面する問題の 1 つは、常に可視とは限らない派生データ型の使用に関することです。たとえば、EJB ファインダにアクセスする際に、Java プログラマは Collection や Enumeration を目にすることになりますが、その基礎となる実装には注意を払いません。これは、JDK ランタイムがネットワークを通じてこれらのクラスをロードするためです。しかし、C++ CORBA プログラマであれば、ネットワークを通じて送られてくるデータ型を把握している必要があります。そうすれば、それに応じた値タイプ ファクトリを登録でき、また ORB でそのデータ型をアンマーシャリングできるようになります。

SAMPLES_HOME/server/src/examples/iiop/ejb/entity/cppclient サンプルにある EJBObjectEnum と Vector がこの例です。定義された EJB インタフェースで ejbc を実行するだけでは、これらの定義は生成されません。インタフェースにそれらが現れないからです。このため、ejbc には、リモート インタフェース以外の Java クラスも指定できるようになっています (これは特に、それらのインタフェースの IDL を生成するのが目的です)。なお、値タイプ ファクトリを登録する方法については、/iiop/ejb/entity/cppclient サンプルを参照してください。

シリアライズ可能でありながら writeObject() を定義する Java 型は、IDL で記述されるカスタム値タイプにマップされます。値タイプを手動でアンマーシャリングする C++ コードを書く必要があります。その方法の例としては、SAMPLES_HOME/server/src/examples/iiop/ejb/enity/tuxclient/ArrayList_i.cpp を参照してください。

注意: Tuxedo を使用する場合には、IDL コンパイラに -i 修飾子を指定することで、FileName_i.h および FileName_i.cpp という実装ファイルを作成させることができます。たとえば、次の構文の場合、TradeResult_i.h および TradeResult_i.cpp という実装ファイルが作成されます。

  idl -IidlSources -i   idlSources¥examples¥iiop¥ejb¥iiop¥TradeResult.idl

結果として生成されるソース ファイルには、値タイプに対するアプリケーション定義の操作が実装されています。実装ファイルは、CORBA クライアント アプリケーションに組み込まれます。

 


RMI-IIOP サンプル コード パッケージ

examples.iiop パッケージは、SAMPLES_HOME/server/src/samples/examples/iiop ディレクトリにあり、その中には、さまざまなクライアントとアプリケーションとの接続性について説明するサンプルが用意されています。これらのサンプルでは、RMI-IIOP での EJB の使用、C++ クライアントへの接続、および Tuxedo サーバとの相互運用性のセットアップに関する例を示しています。詳細については、サンプルの説明を参照してください。特に WebLogic Tuxedo Connector に関するサンプルについては、/wlserver6.1/samples/examples/wtc ディレクトリを参照してください。

 


その他の情報源

WebLogic RMI-IIOP は、RMI の完全な実装を意図したものです。 ご使用のバージョンに該当しそうなその他の考慮事項については、『リリース ノート』を参照してください。

  • WebLogic JNDI プログラマーズ ガイド

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

  • Java Remote Method Invocation (RMI)」ホームページ

  • Sun の RMI 仕様

  • Sun の RMI チュートリアル

  • Sun の RMI over IIOP に関するドキュメント

  • OMG ホームページ

  • CORBA Language Mapping 仕様

  • CORBA Technology and the Java Platform

  • Sun の「Java IDL」ページ

  • Objects-by-Value 仕様
  •  

    Back to Top Previous Next