前へ     目次     索引     DocHome     次へ     
iPlanet Application Server 開発者ガイド



第 10 章   CORBA ベースクライアントの開発と配置


この章では、iPlanet Application Server 環境内で IIOP (RMI over IIOP または IDL over IIOP) プロトコルを介して EJB にアクセスする方法について説明します。

この章には次の節があります。



CORBA クライアントサポートの概要

iPlanet Application Server では、『Enterprise JavaBeans Specification, V1.1』および『Enterprise JavaBeans to CORBA Mapping』仕様書で指定されている IIOP プロトコルを経由した EJB へのアクセスがサポートされています。CORBA クライアントは、JNDI を使って EJB を検索し、Java RMI/IIOP または IIOP とともに C++ IDL を使って、リモート EJB のビジネスメソッドにアクセスします。

この章には次の節があります。


シナリオ

CORBA クライアントを採用するもっとも一般的なシナリオは、スタンドアロンプログラムまたは別のアプリケーションサーバを、iPlanet Application Server に配置した EJB のクライアントととして動作させるケースです。


スタンドアロンのプログラム

もっとも単純なケースの場合、図 10-1 のように、さまざまな OS で動作するスタンドアロンのプログラムは、IIOP を使ってバックエンド EJB コンポーネントに配置されているビジネスロジックにアクセスします。

図 10-1    スタンドアロンのプログラム




サーバ間

図 10-2 の、Web サーバや CORBA オブジェクト、その他のアプリケーションサーバも、IIOP を使って iPlanet Application Server に配置された EJB にアクセスできます。

図 10-2    サーバ間




アーキテクチャの概要

iPlanet Application Server での CORBA クライアントサポートには、CORBA Executive Server (CXS) という特殊な Java エンジンプロセスが関与します。CXS は、IIOP を使う Java または C++ クライアントと、EJB コンテナとしての役割を果たす 1 つまたは複数の Java エンジンに配置された EJB 間のブリッジとして機能します。この IIOP ブリッジプロセスでは、図 10-3 のように、CORBA クライアントがアクセスする EJB ごとに、着信する IIOP ベースのリクエストが処理されます。これらのリクエストは EJB コンテナ内に配置された EJB への内部呼び出しにマッピングされます。

図 10-3    アーキテクチャ



このリリースの iPlanet Application Server では、iPlanet Application Server に組み込まれている ORB やサードパーティの ORB (ORBIX 2000) を使うことができます。



バンドルされている iPlanet ORB は、JDK 1.2 以前、または iPlanet Application Server の初期のバージョンでは機能しません。




iPlanet の付加価値機能

CORBA クライアントの iPlanet 実装では、次の付加価値機能が提供されるため、仕様以上の機能が実現します。


ネーミングサービス

CORBA クライアントは、標準 CORBA COS Naming Service を使って EJBHome オブジェクトを解決します。EJB が iPlanet Application Server に配置されると、EJB は、ネーミングサービスに自動的かつダイナミックに登録されます。


C++ クライアントサポート

このリリースの iPlanet Application Server では、UNIX システム上の C++ クライアントで IIOP を使用できます。詳細については、「C++ IIOP クライアントアプリケーション (UNIX のみ)」を参照してください。


組み込み ORB とサードパーティ ORB のサポート

iPlanet には、EJB への IIOP アクセスをサポートする組み込み ORB が用意されています。iPlanet Application Server で IIOP を使うために、サードパーティ ORB (ORBIX 2000) をインストールして設定することもできます。詳細については、「ORB の選択」を参照してください。


基本認証と EJB コンテナの統合

CORBA 標準では、CORBA クライアントと EJB サーバ間で基本認証を実行する方法はまだ定義されていませんが、iPlanet のアプリケーションサーバでは、このサポートが提供されています。この機能によって、EJB 配置者は Web および CORBA クライアントの両方に適用される標準の宣言およびプログラム制御を使って EJB へのアクセスを制御できます。

CORBA クライアントが iPlanet Application Server に認証を求めると、標準 EJB セキュリティメカニズムに基づいて、認証に必要な主要な情報が EJB コンテナに自動的に伝播します。iPlanet には、クライアントのユーザ名およびパスワードのコレクションをトリガするクライアントサイドコールバックメカニズムが用意されています。このメカニズムによって、アプリケーションは、アプリケーション固有の方法でユーザ名とパスワードを取得します。iPlanet CORBA インフラストラクチャがユーザ名およびパスワード情報を収集すると、この情報は、IIOP を介してアプリケーションサーバに伝播します。


クライアントサイド認証

ORBIX 2000 が RMI/IIOP に使用される ORB の場合、移植可能なインターセプタは、セキュリティを実装するためにフック (インターセプトポイント) を設定します。インターセプトポイントは、リクエストにステージを定義し、シーケンスを返信します。ネーミングサービスは、これらのインターセプトポイントを使って、リクエストの照会とデータの返信を行い、クライアントとサーバ間のサービスコンテキストを転送します。

インターセプタは、クライアントサイドとサーバサイドに 1 つずつ設定されます。クライアントインターセプタは、サーバに送信される前にリクエストをインターセプトし、Principal クラス (com.netscape.ejb.client.IUserPrincipal を実装するクラス) が設定されているかどうかを確認します。設定されている場合は、そのクラスをインスタンス化し、setPrincipal メソッドを呼び出します。setPrincipal メソッドには、userId および password インスタンス変数を設定する必要があります。このメソッド内でカスタムコードを実装し、ユーザ ID とパスワードを取得するためです。クライアントインターセプタは、対応するアクセサを使って、これらの値を取得します。

取得した値は、PICurrent オブジェクト (スロットのテーブル) に格納されます。PICurrent オブジェクト内のスロットは、ユーザ ID とパスワードごとに作成されます。次に、クライアントインターセプタは、ユーザ ID とパスワードごとにサービスコンテキストを作成し、それらを追加したリクエストを送信します。ユーザ ID とパスワードは、最初のリクエストの PICurrent オブジェクトに格納されます。後続のリクエストのユーザ ID とパスワードは、PICurrent オブジェクトから取得されます。

Principal クラスが設定されていない場合、リクエストはそのまま送信され、サービスコンテキストデータは追加されません。

サーバサイドでは、リクエストを受信すると、サーバインターセプタを呼び出します。サーバインターセプタは、サービスコンテキストデータがリクエストに存在するかどうかを確認します。存在しない場合、リクエストの処理を継続します。サービスコンテキストデータが存在する場合、サーバインターセプタはユーザ ID とパスワードを抽出して、セキュリティマネージャの login メソッドを呼び出します。このメソッドは、ユーザを認証します。認証に失敗した場合は、例外をクライアントに返します。認証に成功した場合は、リクエストの処理を継続します。



認証/認可に失敗すると、java.rmi.AccessException がクライアントへスローされます。java.rmi.AccessExceptionjava.rmi.RemoteException から派生します。



この機能を有効にするには、ORBInitializer クラスを使って、サーバサイドおよびクライアントサイドにインターセプタを登録する必要があります。クライアントサイドの ORBInitilaizer クラスでも、PICurrent オブジェクトを作成します。

アクセスを制御するロールは、メソッドまたは Bean レベルで割り当てられます。EJB コンテナは、セキュリティマネージャからロールマッピング情報を取得して、メソッドまたは Bean へのアクセスを認可します。ユーザが認可された場合は、そのメソッドが実行されます。認可されない場合は、java.rmi.AccessException がスローされます。


ロードバランス

新しい IIOP リクエストが iPlanet Application Server のインスタンスに着信すると、iPlanet Application Server は、EJB コンテナとして機能する 1 つまたは複数の JVM 間でこれらのリクエストをロードバランスします。ロードバランスは単純なラウンドロビン方式で実装されています。アプリケーションサーバを起動すると、使用可能な EJB コンテナプロセス (Java エンジン) のリストを取得します。ホーム検索リクエストを CORBA クライアントから受信すると、アプリケーションサーバは、エンジンのリストから、EJB ホームを管理しているターゲットエンジンを選択します。それに続く EJB ホームの検索、そのホームでの Bean の作成、および作成した Bean でのビジネスメソッドの起動は、同じターゲットエンジンに関連します。


クライアントサイドロードバランス
組み込みの iPlanet ORB が使用される場合、クライアントアプリケーションは、使用可能な CORBA プロセスのリストを繰り返したり、ラウンドロビン DNS を使って基本的なクライアントサイドロードバランスを実装したりできます。

ORBIX 2000 が使用される ORB の場合は、ほかの方式のクライアントサイドロードバランスを利用できます。ネーミングサービスでは、名前とオブジェクトを対応付けたリポジトリを定義します。名前とオブジェクトは、1 対 1 で対応付けます。ORBIX 2000 では、ネーミングサービスモデルを拡張し、1 つの名前をオブジェクトのグループに対応付けることができます。オブジェクトグループは、オブジェクトの集合で、サイズを動的に調節できます。オブジェクトグループごとに、選択アルゴリズムを指定します。このアルゴリズムは、オブジェクトグループに関連付けられた名前をクライアントが解決するときに適用されます。次の 3 つのアルゴリズムがサポートされています。

  • ラウンドロビン選択

  • ランダム選択

  • アクティブロードバランス選択

オブジェクトグループを利用すれば、頻繁に要求されるオブジェクトを複製して、リクエストの処理負荷を分散することができます。ネーミングサービスは、オブジェクトグループの選択アルゴリズムに従って、クライアントリクエストを複製されたオブジェクトに転送します。オブジェクトグループは、クライアントに対して透過的です。クライアントは、ほかの名前と同様に、オブジェクトグループの名前を解決します。


スケーラビリティ

アプリケーションサーバの各インスタンスに、複数の CORBA プロセスを設定できます。この機能を使って、システム管理者は受信する IIOP リクエストを専門的に処理する任意の数の JVM を設定できます。また管理者は、各 CORBA および EJB コンテナプロセスが使用可能な処理スレッドの数を変更して、システムの予測される負荷に適合させることもできます。


利用度の向上

次の機能によって、利用度が向上します。

  • Java エンジンの自動再起動 : アプリケーションサーバは、EJB コンテナをサポートする Java エンジンだけでなく、ブリッジプロセスも監視します。プロセスが失敗しても、管理サービスによって自動的にプロセスが再起動します。

  • 状態のあるセッション Beans のフェールオーバー : CORBA クライアントは、iPlanet Application Server に組み込まれた EJB の状態のあるセッション Beans のレプリケーション機能を利用できます。EJB コンテナを配置している Java エンジンが失敗しても、Java エンジンが再起動し、状態のあるセッション Beans に対する後続のリクエストが引き続き処理されます。

  • EJB ハンドルおよびオブジェクト参照フェ―ルオーバー : ブリッジプロセスが失敗しても、プロセスは自動的に再起動され、CORBA クライアントは、引き続き EJB にアクセスできます。


ファイヤウォールで開くポートの数の最小化

組み込みの iPlanet ORB が使用されると、ブリッジプロセスは、共通の固定 IP ポート番号を使って行われるネーミングサービスメソッドおよびビジネスメソッドの両方を呼び出します。この方法によって、CORBA クライアントと、ブリッジプロセスが設定されている iPlanet Application Server インスタンス間に配置されているファイヤウォールで開くポートの数を最小限に抑えることができます。


制約事項

iPlanet Application Server で CORBA クライアントを使う場合は、次の制約事項があります。

  • EJB へのアクセスに限られる

  • 一般的な RMI オブジェクトには RMI/IIOP 経由ではアクセスできない

  • Java RMI/IIOP クライアントからのトランザクション伝播はサポートされない

  • クライアントサイドで JDK 1.3.x を使用している場合は、基本的なデータタイプのみを交換できます。


ORB の選択

iPlanet には、EJB への IIOP アクセスをサポートする組み込み ORB が用意されています。iPlanet Application Server で IIOP を使うために、サードパーティ ORB (ORBIX 2000) をインストールして設定することもできます。

会社が ORBIX 2000 を標準 ORB として使っている場合、または EJB と通信する C++ クライアントを開発する場合は、iPlanet Application Server を ORBIX 2000 用に設定する必要があります。ORBIX 2000 では、追加の認証およびロードバランスも利用できます。ORBIX 2000 のインストール、および ORBIX 2000 と iPlanet Application Server の統合の詳細については、『管理者ガイド』を参照してください。

ORBIX 2000 用に RMI/IIOP アプリケーションを設定する方法については、「ORBIX 用に RMI/IIOP アプリケーションを設定する」を参照してください。ORBIX 2000 を使用するために C++ IIOP アプリケーションを設定する方法については、「ORBIX 用 C++ IIOP アプリケーションの設定」を参照してください。



RMI/IIOP クライアントアプリケーション



iPlanet Application Server での RMI/IIOP ベースクライアントアプリケーションの使用法は、ほかの J2EE 認定アプリケーションサーバでのクライアントの使用法とほぼ同じです。クライアントの JNDI 検索部分に最小限の変更を加えるだけで、Java クライアントを再利用してさまざまな J2EE アプリケーションサーバと連動させることができます。

この節には次の節があります。


RMI/IIOP クライアントアプリケーションの開発

この節には次の節があります。


EJB ホームインタフェースの JNDI 検索

RMI/IIOP クライアントのコードを作成するには、最初に EJB のホームインタフェースを検索します。ホームインタフェースの JNDI を検索する準備として、まず、InitialContext の環境プロパティをいくつか設定する必要があります。次に、EJB の検索名を指定します。

次の節では、手順と例を示します。


ネーミングファクトリクラスの指定
RMI/IIOP 仕様書に従って、クライアントは、Properties オブジェクトのインスタンス内の java.naming.factory.initial エントリの値として、com.sun.jndi.cosnaming.CNCtxFactory を指定する必要があります。さらに、このオブジェクトは、EJB のホームインタフェースを検索する前に JNDI InitialContext コンストラクタに渡されます。次のようにします。

...
Properties env = new Properties();
env.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
env.put("java.naming.provider.url", "iiop://" + host + ":"+port);
Context initial = new InitialContext(env);
Object objref = initial.lookup("java:comp/env/ejb/MyConverter");
...


ターゲット IIOP ブリッジの指定
RMI/IIOP 仕様書に従って、クライアントは、java.naming.provider.url プロパティを次の形式の値に設定する必要があります。

iiop://server:port

server は、iPlanet Application Server インスタンスが配置されているホストを示します。port は、アプリケーションサーバホスト上で実行される IIOP ブリッジプロセスを示します。

java.naming.factory.initial プロパティとともに、java.naming.provider.url プロパティを、コマンドラインで、またはクライアントアプリケーションのコードで指定できます。

次に、Java コマンドライン (このコマンドはすべて 1 行で指定すること) で IIOP URL を設定する例を示します。

java -Djava.naming.provider.url="iiop://127.0.0.1 :9010" -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory j2eeguide.cart.CartClient

この場合、クライアントアプリケーションは、Properties オブジェクトをインスタンス化する必要はありません。

...
public static void main(String[] args) {
   Context initial = new InitialContext();
   Object objref = initial.lookup("java:comp/env/ejb/MyConverter");
   ...
}

代わりの方法として、クライアントアプリケーション内に IIOP URL を設定できます。次の例では、クライアントのメインクラスに 2 つのコマンドライン引数を渡します。

...
public static void main(String[] args) {
   String host = args[0];
   String port = args[1];
   Properties env = new Properties();

   env.put("java.naming.factory.initial",
       "com.sun.jndi.cosnaming.CNCtxFactory");

   env.put("java.naming.provider.url", "iiop://" + host + ":"+port);

   Context initial = new InitialContext(env);
   Object objref = initial.lookup("java:comp/env/ejb/MyConverter");
...
}


EJB の JNDI 名の指定
新しい JNDI InitialContext オブジェクトが作成されると、クライアントは、InitialContext に対して lookup メソッドを呼び出して EJB のホームインタフェースを検索します。EJB の名前は、lookup の呼び出しで指定されています。RMI/IIOP を使ってリモート EJB にアクセスする場合、パラメータは、EJB の「JNDI 名」として参照されます。クライアントアプリケーションのパッケージ方法によって、サポートされている JNDI 名の値は異なります。


アプリケーションクライアントコンテナを使わない JNDI 名
クライアントがアプリケーションクライアントコンテナ (ACC) の一部としてパッケージされていない場合は、JNDI 検索で、EJB の絶対名を指定する必要があります。iPlanet では、ACC の外部で JNDI 検索を実行するために次の方法がサポートされています。

initial.lookup("ejb/ejb-name");

initial.lookup("ejb/module-name/ejb-name");

ejb-name は、EJB の配置記述子の <ejb-name> 要素内に存在するときの EJB の名前です。たとえば、次に値 MyConverter を使った検索を示します。

initial.lookup("ejb/MyConverter");

この検索では、次のように、EJB 配置記述子が MyConverter<ejb-name> として指定する必要があります。

<ejb-jar>
   <enterprise-beans>
       <session>
          <ejb-name>MyConverter</ejb-name>
          <home>j2eeguide.converter.ConverterHome</home>
          <remote>j2eeguide.converter.Converter</remote>
          ...
       </session>
   </enterprise-beans>
</ejb-jar>

RMI/IIOP クライアント上で JNDI 検索に EJB 名だけを使った場合は、この名前を持つ EJB が 1 つだけアプリケーションサーバに登録されている場合に限り、適切に動作します。この名前を持つ複数の EJB が登録されている場合は、対象となる EJB が存在する EJB JAR モジュールの名前で、EJB 名を限定する必要があります。それには、JNDI 検索で EJB 名の前に EJB JAR モジュール名を付けます。EJB JAR モジュール名は、EJB JAR ファイルの名前から.jar 拡張子を除いた名前です。

Converter サンプルアプリケーションの EJB JAR モジュール名は j2eeguide-converterEjb (j2eeguide-converterEjb.jar の EJB JAR ファイル名に基づく) となるため、モジュール名をベースとした検索は次のようになります。

initial.lookup("ejb/j2eeguide-converterEjb/MyConverter");

アプリケーションクライアントコンテナのパッケージングを使わない RMI/IIOP クライアントから JNDI 検索を実行する場合は、必ずモジュール名修飾子を使うとようにすると安全です。モジュール名を使う方法の唯一の欠点は、クライアントが、EJB 絶対名だけでなくサーバサイド環境の配置構造について余分な情報を認識してしまうことです。

Service Pack 3 では、絶対参照で検索を実行する場合、プレフィックス java:comp/env/ejb/ も使用できます。たとえば、Converter サンプルでの検索は次のように記述できます。

initial.lookup("java:comp/env/ejb/MyConverter");

また、モジュール名を使う場合は次のように記述します。

initial.lookup("java:comp/env/ejb/j2eeguide-converterEjb/MyConverter");

このプレフィックスを指定した場合と最初の 2 つの方法の間には、機構的な違いはありません。この表記法は EJB 間接参照を使う場合にも利用されるので、EJB 絶対参照とともに java:comp/env/ejb/ を使う場合、混乱しないよう注意が必要です。


アプリケーションクライアントコンテナを使う場合の JNDI 名
アプリケーションクライアントコンテナ (ACC) を使ってクライアントを収容する場合、JNDI 名には、ACC 配置記述子の <ejb-ref-name> 要素で指定されている EJB の論理名を使用できます。EJB の JNDI 名を指定するこの方法は、ACC のコンテキストにおけるクライアントのパッケージングおよび実行方法によって異なりますが、アプリケーションサーバ内に配置されている Servlet または EJB 内で使われている方法とほぼ同じです。

EJB で検索を実行する Servlet および EJB の場合と同様に、検索の形式は次の例のようになります。

initial.lookup("java:comp/env/ejb/ejb-ref-name");

ejb-ref-name は、ACC 配置記述子の <ejb-ref-name> 要素で指定されている値です。

次の例では、SimpleConverter は、ACC 配置記述子の <ejb-ref-name> 要素内で指定されているので、SimpleConverter の値は JNDI 検索で使われます。

initial.lookup("java:comp/env/ejb/SimpleConverter");

application-client.xml ファイルは次のようになります。

<application-client>
   <display-name>converter-acc</display-name>
   <description>
       Currency Converter Application Client Container Sample
   </description>
   <ejb-ref>
       <ejb-ref-name>SimpleConverter</ejb-ref-name>
       <ejb-ref-type>Session</ejb-ref-type>
       <home>j2eeguide.converter.ConverterHome</home>
       <remote>j2eeguide.converter.Converter</remote>
       <ejb-link>Test</ejb-link>
   </ejb-ref>
</application-client>

ACC パッケージングを使う利点は、クライアントアプリケーションで指定されている JNDI 名が、EJB の JNDI 絶対名に間接的にマッピングされることです。ACC を使う利点はほかにありません。詳細については、「アプリケーションクライアントコンテナ (ACC) の使用」を参照してください。


JNDI サンプル
次のクライアントプログラムは、iPlanet Application Server にバンドルされている『J2EE 開発者ガイド』にあるサンプルの一部である Currency Converter アプリケーションからの抜粋です。アプリケーションサーバに含まれる RMI/IIOP の例については、「RMI/IIOP サンプルアプリケーション」を参照してください。

package j2eeguide.converter;

import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

import j2eeguide.converter.Converter;
import j2eeguide.converter.ConverterHome;

public class ConverterClient {

public static void main(String[] args) {
   try {

       if (args.length != 2) {
          System.out.println("Wrong number of arguments to client");
          System.exit(1);
       }
       String host = args[0];
       String port = args[1];
       Properties env = new Properties();
       env.put("java.naming.factory.initial",
          "com.sun.jndi.cosnaming.CNCtxFactory");
       env.put("java.naming.provider.url", "iiop://" + host
          + ":"+port);

       Context initial = new InitialContext(env);
       Object objref = initial.lookup("ejb/MyConverter");

// あるいは、モジュール名は修飾子として使用できます。
// Object objref =
// initial.lookup("ejb/j2eeguide-converterEjb/MyConverter");

       ConverterHome home
          =(ConverterHome)PortableRemoteObject.narrow(objref,
          ConverterHome.class);

       Converter currencyConverter = home.create();

       double amount = currencyConverter.dollarToYen(100.00);

       System.out.println(String.valueOf(amount));

       amount = currencyConverter.yenToEuro(100.00);

       System.out.println(String.valueOf(amount));

   }

   catch (Exception ex) {
       System.err.println("Caught an unexpected exception!");
       ex.printStackTrace();
   }
}
}


クライアント認証

RMI/IIOP クライアントのオプションの認証メカニズムを利用するには、com.netscape.ejb.client.IUserPrincipal インタフェースを実装するセキュリティプリンシパルクラスを指定する必要があります。JNDI lookup メソッドが呼び出されると、このクラスは、クライアントサイドの iPlanet RMI/IIOP インフラストラクチャによって一度インスタンス化されます。クライアントサイドの RMI/IIOP インフラストラクチャは、JNDI 検索によってリモートネーミングサービスへの呼び出しがトリガされる前に、このインタフェースの setPrincipal メソッドを呼び出します。

クライアント実行時にRMI/IIOP インフラストラクチャがクラスを読み込むには、このセキュリティプリンシパルクラスをクライアントのプロパティで指定し、クラスをクライアントの CLASSPATH 内に挿入する必要があります。

たとえば、Converter サンプルアプリケーションでは、JNDI 検索を実行する際に、セキュリティプリンシパルクラスのインスタンス化を指定する 3 番目のプロパティを追加できます。

...
Properties env = new Properties();
env.put("java.naming.factory.initial",
   "com.sun.jndi.cosnaming.CNCtxFactory");
env.put("java.naming.provider.url", "iiop://" + host + ":"+port);
env.put("com.netscape.ejb.client.PrincipalClass",
   "j2eeguide.converter.RmiPrincipal");

Context initial = new InitialContext(env);
Object objref = initial.lookup("ejb/MyConverter");
...

RmiPrincipal クラスは、com.netscape.ejb.client.IUserPrincipal インタフェースを実装するためにユーザが開発するクラスです。


プリンシパルクラスのサンプル
IUserPrinicpal インタフェースはさまざまな方法で実装できます。もっとも簡単な方法は setPrinciapl コールバックでダイアログをポップアップし、ユーザとパスワードの組み合わせを取得し、それらをユーザ名とパスワードの文字列フィールドに保存することです。これによって、クライアントが EJB を起動するたびに getUserId() および getPassword() メソッドが使われ、クライアントによって伝播されたセキュリティコンテキストが設定されます。

IIOP ブリッジは、iPlanet Application Server セキュリティマネージャを使ってユーザとパスワードを認証しようとします。ブリッジに認証例外が発生すると、クライアントサイド ORB に通知され、setPrincipal メソッドが呼び出されて正しいユーザ/パスワード情報を取得します。認証例外がクライアントサイドで発生すると、クライアントサイド RMI/IIOP インフラストラクチャは自動的にリクエストを 3 回試行します。

...
import com.netscape.ejb.client.IUserPrincipal;

public class Principal implements IUserPrincipal {

   private String username;
   private String password;

   public void setPrincipal() {
       //GUI をポップアップし、ユーザ名とパスワードを取得します。
   }

   public String getUserId() {
       return username;
   }

   public String getPassword() {
       return password;
   }
}

IUserPrinicpal のもう一つの有効な実装方法は、同じクライアントの JVM で複数のユーザ ID をサポートすることです。それには、ThreadLocal 変数を使って、ユーザ名とパスワードを保存します。この場合、IUserPrincipal 実装のメソッドに、ThreadLocal を認識させる必要があります。


クライアントサイドのロードバランスおよびフェールオーバー

iPlanet Application Server には RMI/IIOP アクセスのため、サーバサイドのロードバランスおよびフェールオーバーが用意されていますが、アプリケーションのパフォーマンスおよび利用度をさらに向上させるため、クライアントサイドの方法を実装することも検討してください。


iPlanet ORB の設定
組み込みの iPlanet ORB を使用している場合は、クライアントサイドのロードバランスを次のような方法で設定できます。

  • 既知のブリッジのリストから手動で選択する

    クライアントビジネスアプリケーションの代わりに、一連の既知のブリッジホスト名およびポートの組み合わせをラウンドロビン方式で使う wrapper クラスを作成できます。ホスト名/ポートの組み合わせの一つで通信例外が発生した場合、wrapper クラスは、リスト内の次のホスト名/ポートの組み合わせを使います。

    たとえば、リモート IIOP ブリッジに接続できない場合、基本となるクライアントクラスによって次の例外がスローされます。

    javax.naming.CommunicationException:Cannot connect to ORB.Root exception is org.omg.CORBA.COMM_FAILURE:

    クライアントの wrapper コードはこの例外を受け取り、次に使用可能な host_name:port ペアを選択して EJB にアクセスし直します。

  • ラウンドロビン DNS

    DNS のラウンドロビン機能を利用すると、クライアントのソースコードを変更せずに簡単なロードバランス方法を実装できます。この方法では、IIOP ブリッジプロセスがリッスンするときに使う複数の物理 IP アドレスを表す仮想ホスト名を 1 つ定義します。共通 IIOP ポート番号を使ってリッスンするようにすべての IIOP ブリッジプロセスを設定する場合、クライアントアプリケーションは、JNDI 検索時に 1 つの host_name:IIOP_port を使用できます。DNS サーバは、クライアントが実行されるたびに別の IP アドレスからホスト名を取得します。

    クライアントアプリケーションを開発した後、配置の準備としてアプリケーションをパッケージングする必要があります。


ORBIX の設定
ORBIX 2000 が使用される ORB の場合は、ほかの方式のクライアントサイドロードバランスを利用できます。ネーミングサービスでは、名前とオブジェクトを対応付けたリポジトリを定義します。名前とオブジェクトは、1 対 1 で対応付けます。ORBIX 2000 では、ネーミングサービスモデルを拡張し、1 つの名前をオブジェクトのグループに対応付けることができます。オブジェクトグループは、オブジェクトの集合で、サイズを動的に調節できます。オブジェクトグループごとに、選択アルゴリズムを指定します。このアルゴリズムは、オブジェクトグループに関連付けられた名前をクライアントが解決するときに適用されます。次の 3 つのアルゴリズムがサポートされています。

  • ラウンドロビン選択

  • ランダム選択

  • アクティブロードバランス選択

オブジェクトグループを利用すれば、頻繁に要求されるオブジェクトを複製して、リクエストの処理負荷を分散することができます。ネーミングサービスは、オブジェクトグループの選択アルゴリズムに従って、クライアントリクエストを複製されたオブジェクトに転送します。オブジェクトグループは、クライアントに対して透過的です。クライアントは、ほかの名前と同様に、オブジェクトグループの名前を解決します。

UNIX の場合、フラグ ORBIX_LOADBALANCING=true または falseiasenv.ksh ファイルに設定すると、Java 引数を次のように設定できます。

-DORBIXLoadBalancing=$ORBIX_LOADBALANCING

Windows の場合、レジストリの Java 引数を次のように設定できます。

HKEY_LOCAL_MACHINE¥SOFTWARE¥iPlanet¥Application Server¥6.5¥Java¥JavaArgs=-DORBIXLoadBalancing=true


RMI/IIOP クライアントアプリケーションのパッケージング

RMI/IIOP クライアントアプリケーションのパッケージング方法は次のとおりです。


アセンブリツール GUI の使用法

EJB に IIOP 経由でアクセス可能であることを指示すると、iPlanet Application Server 配置ツールによって、EJB 固有のホームおよびリモートインタフェースとスタブクラスを含む JAR ファイルが自動的に生成されます。個々のクラスファイルをクライアントにコピーする代わりに、この JARファイルをクライアントアプリケーションの一部として配置できます。

配置ツールでは、アプリケーションクライアントコンテナの一部として配置されるアプリケーションのパッケージングはサポートされていません。


Ant を使った再組立の自動化

RMI/IIOP クライアントアプリケーションのパッケージングをコマンドラインを使って行う場合は、サンプルアプリケーションの一部として提供されている Ant ベースのbuild.xml ファイルを参照することをお勧めします。RMI/IIOP ベースサンプルの build.xml ファイルには、install_client ターゲットが含まれています。配置ツールがクライアント指向クラスの JAR ファイルを生成する方法と同じように、このターゲットを簡単に強化して、自己完結型クライアント JAR ファイルを組み立てることができます。


アプリケーションクライアントコンテナ (ACC) の使用

iPlanet では、アプリケーションクライアントコンテナにクライアントアプリケーションを配置することをお勧めしませんが、この配置および実行時メソッドは J2EE 仕様の一部としてサポートされています。ただし、現時点の ACC 仕様では、ACC の使い方は複雑で、利点も少ないため、この方法はお勧めしません。また、J2EE v 1.2 では、ACC の定義が制限されているため、ACC のサポートは J2EE アプリケーションサーバによって大きく異なります。

iPlanet Application Server で ACC を試す場合は、次の配置手順を考慮してください。

  • iPlanet Application Server の一部として提供されている iasacc.jar ファイルは、クライアントの CLASSPATH に含める必要があります。このファイルは、次の場所からクライアント環境にコピーできます。

    install_dir/ias/classes/java/iasacc.jar

    このファイルを CLASSPATH に含めると、クライアントの環境に iasclient.jar ファイルを含める必要はなくなります。

  • J2EE v1.2 に準拠した EAR ファイルを作成する必要があります。この EAR ファイルには、次のものが必要です。

    • RMI/IIOP クライアントアプリケーションクラス、ホームおよびリモートインタフェース、スタブ

    • app-client.xml という名前の J2EE v1.2 XML 記述子ファイル。次に例を示します。

      <?xml version="1.0" encoding="UTF-8"?>

      <!DOCTYPE application-client PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.2//EN' 'http://java.sun.com/j2ee/dtds/application-client_1_2.dtd'>

      <application-client>
         <display-name>converter-acc</display-name>
         <description>
         Currency Converter Application Client Container Sample
         </description>
         <ejb-ref>
                <ejb-ref-name>SimpleConverter</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <home>j2eeguide.converter.ConverterHome</home>
                <remote>j2eeguide.converter.Converter</remote>
                <ejb-link>Test</ejb-link>
         </ejb-ref>
      </application-client>

    • iPlanet Application Server 固有の XML 記述子ファイル (通常の名前は ias-app-client.xml)。この記述子によって、EJB 参照が EJB 絶対名にマッピングされます。

      <?xml version="1.0" encoding="UTF-8"?>

      <!DOCTYPE ias-java-client-jar PUBLIC '-//Sun Microsystems, Inc.//DTD iAS Enterprise JavaBeans 1.0//EN' 'http://developer.iplanet.com/appserver/dtds/IASjava_client_jar_1_0.dtd'>

      <ias-java-client-jar>
         <ejb-ref>
                <ejb-ref-name>SimpleConverter</ejb-ref-name>
                <jndi-name>ejb/MyConverter</jndi-name>
         </ejb-ref>
      </ias-java-client-jar>

    • J2EE v1.2 XML 記述子ファイル (application.xml)。

    RMI/IIOP クライアントの EAR ファイルの構造に関する詳細については、第 11 章「配置のためのパッケージ化」を参照してください。



    EJB JAR 名は、.jar拡張子ではなく、ファイル名の最初の部分によって識別されます。Application Server に配置する EJB JAR 名は、一意でなければなりません。ejb-jar.xml ファイルの <ejb-name> 部分に指定する EAR ファイル名および EJB 名には、Java パッケージ方式の命名規則を使ってください。Java パッケージ方式の命名規則を使えば、名前の衝突は発生しません。この命名規則は、iPlanet Application Server だけでなく、ほかの J2EE アプリケーションサーバでも使うことをお勧めします。



アプリケーションクライアントコンテナを介してクライアントを呼び出すコマンドは、次のとおりです。

java com.netscape.ejb.client.AppContainer client_ear_file -iasXml ias_xml_file


RMI/IIOP サポートの設定

iPlanet Application Server に配置された EJB への RMI/IIOP アクセスを有効にするには、次の節で説明するようにアプリケーションサーバおよびクライアントの両方の環境を設定する必要があります。

次の設定手順は一度限り必要です。EJB およびクライアントアプリケーションを配置する際に繰り返す必要はありません。


サーバの設定

iPlanet Application Server をインストールする時点で、IIOP ブリッジプロセスが設定されていない場合は、iPlanet Application Server Administrative Tool を起動して、IIOP ブリッジプロセスをアプリケーションサーバ環境に追加する必要があります。

  1. iPlanet Application Server 管理ツールを起動します。

    UNIX の場合

    install_dir/ias/bin/ksvradmin

    Windows の場合

    「スタート」>「プログラム」>「iPlanet Application Server」>「iAS Administration Tool」を選択します。

  2. アプリケーションサーバインスタンスに接続し、サーバ名アイコンをダブルクリックして、アプリケーションサーバのインスタンスに定義されているプロセスを一覧表示します。少なくとも kjs プロセスが 1 つ、および kxs プロセスが 1 つ表示されます。EJB への RMI/IIOP アクセスには、kxs プロセスは不要です。cxs プロセスが表示された場合は、アプリケーションサーバインスタンスにすでに IIOP ブリッジプロセスが定義されています。この場合は、cxs プロセスエントリをダブルクリックし、IIOP ポート番号を書き留め、次の節に進んでください。ブリッジプロセスが表示されない場合は、次の手順に進んでプロセスを定義してください。

  3. 任意の既存プロセスエントリを選択し、「ファイル」>「新規」>「プロセス」を選択します。

  4. プロセスタイプのプルダウンリストから cxs を選択し、kjs および kxs プロセスによってすでに使われているほかのポート番号と競合しないポート番号 (ポート 10822 など) を入力します。システム環境でほかに割り当てられているポートと競合しないかぎり、デフォルトの IIOP ポート番号 (9010) を選択します。「OK」をクリックしてプロセスをインスタンス化します。

  5. 数秒後、アプリケーションサーバ環境で IIOP ブリッジプロセスが動作している状態が表示されます。このプロセスは、Administrative Tool に一覧表示されているその他のすべてのアプリケーションサーバプロセスとともに、アプリケーションサーバの再起動時に自動的に開始されます。

  6. UNIX の場合、コマンドラインから IIOP ブリッジプロセスの存在も確認できます。たとえば、次のコマンドを入力します (各コマンドはすべて 1 行で指定する)。

    ps -ef | grep iiop

    root 1153 1 0 17:00:15 ?0:00 /bin/sh /usr/iPlanet/ias6/ias/bin/kjs -cset CCS0 -eng 3 -iiop -DORBinsPort=9010

    この出力には、-iiop オプションで開始された iPlanet Java エンジンプロセスが表示されます。このオプションは、Java エンジンのこのインスタンスに、J2EE Web および EJB コンテナプロセスではなく、IIOP ブリッジプロセスとして開始するように指示します。

    cxs プロセスをインスタンス化すると、RMI/IIOP サポートのサーバサイドの設定が完了します。


クライアントの設定

iPlanet に配置されている EJB に Java アプリケーションクライアントがアクセスできるようにするには、図 10-4 のように、適切な Java 2 環境、iPlanet ORB、およびいくつかの JAR ファイルがクライアントシステム上で使用可能になっている必要があります。

図 10-4    クライアントの設定



手順については次の節で説明します。


Java 2 環境と iPlanet ORB の設定
RMI/IIOP 経由でリモート EJB への通信をサポートするには、Java 2 環境と iPlanet ORB がクライアント上に存在する必要があります。iPlanet Application Server の一部としてバンドルされている Java 2 環境、または、「既存の JDK の使用法」の節で説明しているテスト済みの改良型環境のどれかをクライアント上で使う必要があります。ほかの Java 2 環境も正しく動作する場合はありますが、これらの環境は iPlanet ではサポートされていません。


バンドルされた JDK の使用法
iPlanet は、そのほとんどの RMI/IIOP テストを、クライアントサイドの RMI/IIOP ベースアプリケーション向けに推奨されている Java 2 プラットフォーム上で行っています。したがって、Java 2 環境をアプリケーションサーバの一部としてバンドルしています。クライアントサイドでこの JVM を使うには、 Java 2 環境を iPlanet インストールからクライアント環境にコピーし、該当する java 実行可能ファイルを含めるように PATH を適切に設定します。バンドルされている Java 2 環境には iPlanet ORB が含まれているため、クライアントサイドにコピーしたあとに Java 2 環境を変更する必要はありません。

バンドルされている Java 2 プラットフォームは、アプリケーションサーバをインストールした次の場所にあります。

install_dir/ias/usr/java/

サーバの JVM 環境をクライアントにコピーするには、次の手順を実行します。

  1. install_dir/ias/usr/ に移動します。

  2. java/ ディレクトリ全体をクライアント環境にコピーします。java/ ディレクトリを zip または tar 形式で圧縮し、そのアーカイブファイルをクライアントシステムに転送して選択したディレクトリ内で展開できます。

  3. クライアントの PATH を、client_side_JVM_directory/java/bin を含めるように設定します。

  4. java -fullversion を実行して、適切な JDK (1.3.1) が使われていることを確認します。UNIX の場合は、which java を実行してこの動作を確認します。

これで、バンドルされている JDK が iPlanet ORB とともにインストールされました。次に、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。


既存の JDK の使用法
Java 2 環境のいくつかの配布版で基本的なテストを行った結果、簡単なセットアップ手順で、既存の Java 2 環境を活用しながら、iPlanet Application Server に配置されている EJB に RMI/IIOP クライアントがアクセスできることが証明されました。この場合は、iPlanet Application Server 環境からクライアントシステムの既存の JVM に iPlanet ORB ファイルをコピーする必要があります。

iPlanet Application Server では、オペレーティングシステムと Java 2 プラットフォームの次の組み合わせがテストされています。

オペレーティングシステムと Java 2 プラットフォームのほかの組み合わせでも、RMI/IIOP および iPlanet Application Server が正しく連動する場合もありますが、テストは実施されていません。どのような組み合わせを選択しても、設定をテストしてから実際の運用に適した選択を行ってください。


Solaris と JDK 1.3.1
このシナリオでは、Solaris システム上にすでに Java 2 1.2 環境がインストールされており、この JVM を RMI/IIOP クライアントのプラットフォームとして使うことを前提としています。

次の手順では、JAVA_HOME は JDK 1.3.1 配布版をインストールしたディレクトリです。次に例を示します。

export JAVA_HOME=/usr/java1.3

  1. iPlanet Application Server の Solaris をインストールしたディレクトリから Solaris クライアントシステムに j2eeorb.jar をコピーします。

    j2eeorb.jar ファイルをコピーします。

    install_dir/ias/usr/java/jre/lib/ext/j2eeorb.jar

    Solaris クライアントの JDK をインストールしたディレクトリにコピーします。

    $JAVA_HOME/jre/lib/ext

    (削除されるようにするには) 必ず、共有オブジェクトファイルが含まれている sparc/ ディレクトリをこの手順でコピーします。この手順では、iPlanet ORB、固有の直列化ファイル、およびほかのサポートファイルがクライアントにコピーされます。

  2. orb.properties ファイルを、iPlanet をインストールした次のディレクトリから

    install_dir/ias/usr/java/jre/lib/orb.properties

    クライアントの JDK をインストールした次のディレクトリにコピーします。

    $JAVA_HOME/jre/lib/

  3. クライアントアプリケーションが DLL にアクセスできるように PATH を設定します。

    (削除対象) export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/lib/ext/i386:$PATH

これで、iPlanet ORB を使えるように既存の JDK が設定されました。次は、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。


Linux と Java 1.3.1
このシナリオでは、Linux システム上にすでに Java 1.3.1 環境がインストールされており、この JVM を RMI/IIOP クライアントのプラットフォームとして使うことを前提としています。次の方法は、RedHat 6.2 でテスト済みです。



JDK 1.2 と JDK 1.3 の固有の直列化ライブラリに互換性がないため、クライアントサイドで JDK 1.3 を使う場合は、クライアントとサーバ間で基本データタイプの値のみが交換できます。



  1. iPlanet ORB を保持するディレクトリをクライアント上に作成します。次のようにします。

    mkdir -p /opt/iplanet/orb

  2. Linux システムにインストールされた iPlanet Application Server から、クライアントシステム上の適切なディレクトリ、たとえば、/opt/iplanet/orb/ に次の JAR ファイルをコピーします。

    install_dir/ias/usr/java/jre/lib/ext/j2eeorb.jar

  3. 環境を設定します。次のようにします。

    JAVA_HOME=/opt/jdk1.3

    PATH=:$JAVA_HOME/bin:$JAVA_HOME/jre/lib/i386:$PATH

    CLASSPATH=/opt/iplanet/orb/j2eeorb.jar

    LD_LIBRARY_PATH=$JAVA_HOME/jre/lib:$JAVA_HOME/jre/lib/i386

    export JAVA_HOME PATH CLASSPATH LD_LIBRARY_PATH

  4. iPlanet ORB クラスは、コマンドライン (このコマンドはすべて 1 行で指定する) でプロパティとして指定できます。

    java -Dorg.omg.CORBA.ORBClass=com.netscape.ejb.client.ClientORB -Dorg.omg.CORBA.ORBSingletonClass=com.sun.corba.ee.internal.corba.ORBSingleton j2eeguide.converter.ConverterClient ias_host 9010

これで、iPlanet ORB を使えるように既存の JDK が設定されました。次は、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。


Windows 98、NT、または 2000 と Java 1.3.1
このシナリオでは、Windows システム上にすでに Java 1.3.1 環境がインストールされており、この JVM を RMI/IIOP クライアントのプラットフォームとして使うことを前提としています。

次の手順では、JAVA_HOME は JDK 1.3.1 配布版をインストールしたディレクトリです。次に例を示します。

set JAVA_HOME=c:¥JDK1.3.1

  1. iPlanet Application Server の Windows をインストールしたディレクトリから Windows クライアントシステムに j2eeorb.jar をコピーします。

    j2eeorb.jar ファイルを、次のディレクトリから

    install_dir¥ias¥usr¥java¥jre¥lib¥ext¥j2eeorb.jar

    クライアントの JDK をインストールした次のディレクトリにコピーします。

    %JAVA_HOME%¥jre¥lib¥ext

  2. orb.properties ファイルを、iPlanet をインストールした次のディレクトリから

    install_dir¥ias¥usr¥java¥jre¥lib¥orb.properties

    クライアントの JDK をインストールした次のディレクトリにコピーします。

    %JAVA_HOME%¥jre¥lib¥

  3. 固有の直列化 DLL を、iPlanet をインストールした次のディレクトリから

    install_dir¥ias¥usr¥java¥jre¥bin¥ioser12.dll

    クライアントの JDK をインストールした次のディレクトリにコピーします。

    %JAVA_HOME%¥jre¥bin¥

  4. クライアントアプリケーションが DLL にアクセスできるように PATH を設定します。

    set PATH=%JAVA_HOME%¥bin;%PATH%

これで、iPlanet ORB を使えるように既存の JDK が設定されました。次は、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。


RMI/IIOP クライアントサポートクラスのインストール
クライアントサイドで Java 2 プラットフォームが使われていても、クライアントの CLASSPATH にはファイル iasclient.jar を含める必要があります。このファイルは、iPlanet のクライアントの認証機能をサポートするいくつかのセキュリティ関連クラスを含んでいる iPlanet 固有の JAR ファイルです。ACC を使う場合は、iasclient.jar は、iasacc.jar に置き換わります。標準 javax.jar ファイルも、クライアントの CLASSPATH に含める必要があります。このファイルには、ネーミングサービスおよびその他の Java エクステンションの標準 Java インタフェースが含まれています。

これらの JAR ファイルは、iPlanet をインストールしたディレクトリからクライアント環境にコピーし、クライアントの CLASSPATH に追加できます。UNIX の場合、これらのファイルは、iPlanet Application Server をインストールしたディレクトリである次の場所にあります。

install_dir/ias/classes/java/iasclient.jar

install_dir/ias/classes/java/javax.jar

Windows の場合、これらのファイルは、iPlanet Application Server をインストールしたディレクトリである次の場所にあります。

install_dir/ias/classes/java/iasclient.jar

install_dir/ias/lib/java/javax.jar

これらのサポートファイルをクライアント環境にコピーしたあと、JAR ファイルを含めるようにクライアントの CLASSPATH を設定する必要があります。


同じシステム上の EJB への RMI/IIOP クライアントアクセス
アプリケーションサーバと同じマシン上にあるクライアントを使って RMI/IIOP クライアントアクセスを行う場合は、PATH および CLASSPATH 変数のセットアップ手順を短縮できます。既存のインストール済み javax.jariasclient.jar のコピーと install_dirusr/java/bin/ 内の JVM を参照するだけです。たとえば、ローカルで RMI/IIOP アクセスをテストするには、次のように CLASSPATH 変数を設定します。

Windows の場合

set CLASSPATH=d:¥iplanet¥ias6¥ias¥lib¥java¥javax.jar; d:¥iplanet¥ias6¥ias¥classes¥java¥iasclient.jar;%CLASSPATH%

(Windows システムの PATH 環境変数には、バンドルされている JDK の install_dir/usr/java/bin/ がすでに含まれているため、Windows 上で再び設定する必要はありません。)

Windows システムの CLASSPATH は、手動で変数を設定する必要がないように設定できます。

UNIX の場合

export CLASSPATH=/usr/iplanet/ias6/ias/classes/java/javax.jar:/usr/iplanet /ias6/ias/classes/java/iasclient.jar:$CLASSPATH

UNIX の場合、バンドルされている JDK ディレクトリも含めるように PATH を変更する必要があります。

export PATH=/usr/iplanet/ias6/ias/usr/java/bin:$PATH


リモートシステムからの EJB への RMI/IIOP クライアントアクセス
リモートクライアントシステムを使う場合は、次の手順を実行して適切な PATH および CLASSPATH を設定します。

UNIX の場合

適切な Java 2 bin/ ディレクトリを含めるように PATH 環境変数を設定します。

export PATH=Java2_install_dir/usr/java/bin:$PATH

標準 Java 拡張機能クラスと iPlanet RMI/IIOP クライアントサポート JAR を含めるように CLASSPATH を設定します。

export CLASSPATH=/opt/rmi-client/iasclient.jar:/opt/rmi-client/javax.jar:$ CLASSPATH

正しく設定されているかどうか CLASSPATH を再び確認します。CLASSPATH は、次に示す設定と異なる場合があります。

echo $CLASSPATH

/opt/rmi-client/iasclient.jar:/opt/rmi-client/javax.jar:

Windows の場合

適切な JDK の bin/ ディレクトリを含めるように PATH 環境変数を設定します。

set PATH=Java2_install_dir¥usr¥java¥bin;%PATH%

標準 Java 拡張機能クラス (javax.jar) および iPlanet クライアントサポート JAR (iasclient.jar) を含めるように CLASSPATH を設定します。

set CLASSPATH=d:¥rmi-client¥javax.jar;d:¥rmi-client¥iasclient.jar;%CLASS PATH%


RMI/IIOP クライアントアプリケーションの配置

クライアントアプリケーションを開発する場合、開発環境からクライアントシステムに多数のファイルを配置する必要があります。この節の次の項で、RMI/IIOP 対応クライアントアプリケーションの配置に必要な基本手順について説明します。


クライアントの配置

クライアントアプリケーションクラスがクライアントシステム上で使用可能になっていることを確認するだけでなく、EJB 固有のホームおよびリモートインタフェースとそれらの対応スタブがクライアントシステムに配置されていることを確認する必要があります。たとえば、Converter サンプルアプリケーションでは、次のクラスをクライアントシステムにコピーする必要があります。

ホームおよびリモートインタフェースクラス

ConverterHome.class

Converter.class

EJB 固有の iPlanet クライアントスタブ

_Converter_Stub.class

_ConverterHome_Stub.class


配置ツール

配置ツールは、ホームおよびリモートインタフェースと RMI/IIOP スタブクラスだけが含まれている JAR ファイルを生成します。現時点では、その他のクライアントアプリケーションクラスおよびリソースはパッケージされません。

Java ベースの Ant ビルド機能を使うと、クライアントアプリケーションの組み立てを簡単に自動化できます。Ant を使ってクライアントアプリケーションのパッケージおよび配置を行う場合の例については、RMI/IIOP サンプルアプリケーションを参照してください。


サーバの CLASSPATH の設定 (SP2 以前)

この節の記述は、iPlanet Application Server 6.0 Service Pack 2 (SP2) 以前に適用されます。Service Pack 3 以降には、次の設定手順は不要です。SP 3 以降を使う場合は、「RMI/IIOP クライアントアプリケーションの実行」に進んでください。

iPlanet Application Server Service Pack 2 以前で EJB クラスを読み込むには、IIOP ブリッジプロセスが、アプリケーションサーバの CLASSPATH を使って EJB スタブとホーム/リモートインタフェースにアクセスできるようになっている必要があります。RMI/IIOP ベースの Java アプリケーションクライアントを SP 2 以前で初めて実行する場合は、まずアプリケーションサーバの CLASSPATH を変更する必要があります。

iPlanet Application Server 6.0 SP2 以降、EJB ベースアプリケーションを登録すると EJB JAR ファイルがアプリケーションサーバの配置ディレクトリに展開されるようになりました。デフォルトでは、j2eeguide-converter.ear などの J2EE アプリケーションをアプリケーションサーバに配置すると、j2eeguideEjb.jar などの組み込み EJB JAR ファイルが次のディレクトリに展開されます。

install_dir/ias/APPS/j2eeguide-converter/j2eeguide-converterEjb/

スタンドアロン EJB JAR モジュール (または WAR モジュール) を iPlanet Application Server に配置する場合、このスタンドアロンモジュールのデフォルトの展開場所は次のディレクトリになります。

install_dir/ias/APPS/modules/j2eeguide-converterEjb/

RMI/IIOP クライアントを実行する前に、適切なモジュールディレクトリをアプリケーションサーバの CLASSPATH に追加する必要があります。


ORBIX 用に RMI/IIOP アプリケーションを設定する

『管理者ガイド』で説明しているように、ORBIX 2000 をインストールして iPlanet Application Server と統合すれば、使用する ORB (組み込みまたは ORBIX) を RMI/IIOP クライアントアプリケーションごとに選択することができます。この節では、ORBIX を使用するために、RMI/IIOP クライアントを設定する方法について説明します。

ORBIX とクライアントサイドのロードバランスについては、「クライアントサイドのロードバランスおよびフェールオーバー」を参照してください。


参照資料


設定の手順

設定の手順は、ファイルパスの形式を除いて、UNIX と Windows で違いはありません。次の例では、UNIX のファイルパスを使用しています。

  1. ORBIX 2000 バージョン 1.2.1 をインストールします。ライセンスファイルを /etc/opt/iona/ にコピーし、ライセンスをインストールします。『管理者ガイド』および ORBIX のマニュアルを参照してください。

  2. ORBIX ドメインコンフィグレーションファイルを、サーバ上の ORBIX のインストール先 (ネーミングサービスを実行している場所) から別のディレクトリ (たとえば、次のディレクトリ) にコピーします。

    /etc/opt/iona/domains

    このファイルには、サーバ上の ORBIX にアクセスするために必要な設定情報が含まれています。クライアントプログラムは、このファイルを使ってネーミングサービスに接続します。

    クライアントとサーバが同じマシン上で動作している場合、このファイルは必要ありません。その場合は、localhost 設定 (デフォルト) が使われます。

  3. 事前にパッケージされているサンプルアプリケーションのいずれかをインストールする場合は、ejbc ユーティリティを使用して、スタブとスケルトンを再生成します。ejbc については、「ejbc コンパイラの使用法」を参照してください。

  4. クライアントアプリケーションをインストールします。

  5. アプリケーションに関連付けられたスタブ (*Stub*.class) をクライアントディレクトリにコピーします。たとえば、次の方法で実行します (改行しない)。

    cp ias_inst_dir/ias/APPS/j2eeguide-converter/j2eeguide-converterEjb/j2eeguide/converter/ _Converter_Stub.class client_inst_dir/j2eeguide/converter

    次の処理も実行します (改行しない)。

    cp ias_inst_dir/ias/APPS/j2eeguide-converter/j2eeguide-converterEjb/j2eeguide/converter/ _ConverterHome_Stub.class client_inst_dir/j2eeguide/converter

  6. クラスパスを設定します。たとえば、次の方法で実行します (改行しない)。

    export CLASSPATH=orbix_inst_dir/orbix_art/1.2/classes/orbix2000.jar:orbix_inst_dir/orbix_art/1.2 /classes/omg.jar:orbix_license_file_path/licenses.txt:server_orbix_config_file_path: ias_inst_dir/classes/java/javax.jar:ias_inst_dir/ias/classes/java/iasclient.jar

    iPlanet Application Server がクライアントマシンにインストールされていない場合は、任意の iPlanet Application Server (バージョン 6.5) の javax.jar ファイルをクライアントマシンにコピーして、クラスパスに設定します。

  7. ORBdomain_name プロパティをサーバの ORBIX コンフィグレーションファイルのドメイン名に設定します。このファイルについては、ORBIX のマニュアルを参照してください。この設定は、次の 2 つの方法で行うことができます。

    • クライアントを実行するときに、Java コマンドラインで ORBdomain_name プロパティを設定する

      この場合、jdk_inst_dir/jre/lib/orb.properties ファイル内の org.omg.CORBA.ORBClass プロパティは com.iplanet.ias.iona.clientorb.IONAorb に設定する必要がある。さらに、iasclient.jar ファイルを手順 6 に示してあるクラスパスに含めなければならない

    • クライアントプログラムで、ORBdomain_name プロパティを文字列の配列として ORB.init 呼び出しの最初のパラメータに渡す。これにより、ORB が初期化される。初期化された ORB は、JNDI 呼び出しに渡すことができる。つまり、後続の CORBA 初期化呼び出しは、その ORB 上で呼び出すことができる。

      この場合、jdk_inst_dir/jre/lib/orb.properties ファイル内の org.omg.CORBA.ORBClass プロパティは com.iona.corba.art.artimpl.ORBImpl に設定する必要があります。

    初期化された ORB を JNDI 呼び出しに渡す方法については、JDK のマニュアルで JNDI に関する説明を参照してください。

    IONAorb クラスを使うこともできます。IONAorbcom.iona.corba.art.artimpl.ORBImpl (ORBIX ORB クラス) から派生し、set_parameters メソッドをオーバーロードします。set_parameters メソッドでは、ORBname プロパティおよび ORBdomain_name プロパティが読み込まれ、ORB.init 呼び出しに渡されます。

  8. orb. ファイル内の次のプロパティを変更します。ファイルは、jdk_ inst_dir/jre/lib にあります。

    org.omg.CORBA.ORBSingletonClass=com.iona.corba.art.artimpl.ORBSingleton

  9. クライアントを実行します。



    組み込み ORB は、IIOP URL (ホスト名とポート番号を含む) を使って iPlanet Application Server に接続します。ORBIX ORB は、CXS への接続にこの URL を使いません。

    組み込み ORB が使われている場合、ネーミングサービスは CXS への in-process です。ORBIX ORB が使われている場合、ネーミングサービスは out-of-process です。

    ORBIX Java クライアントが java.util.vector などの Java コンテナ内部に埋め込まれたユーザ定義の直列化可能なオブジェクトを渡そうとすると、MARSHALLING 例外が発生します。




セキュリティの有効化

セキュリティを有効にするには、クライアントを起動する前に次の手順を実行します。

  1. 次のプロパティに値が設定されていないことを確認します。等号の右辺には、空白にしてください。

    org.omg.PortableInterceptor.ORBInitializerClass.com.iplanet.ias.iona. orbinitializers.IONAClientORBInitializerImpl=

  2. ORBname プロパティを、client_interceptor 名が登録されている範囲に含まれる orbname に設定します。この設定は、次の 2 つの方法で行うことができます。

    • Java コマンドラインで ORBname プロパティを設定する

      この場合、org.omg.CORBA.ORBClass プロパティは、com.iplanet.ias.iona.clientorb.IONAorb に設定しなければならない。

    • クライアントプログラムで、ORBname プロパティを文字列の配列として ORB.init 呼び出しの最初のパラメータに渡す。これにより、ORB が初期化される。初期化された ORB は、JNDI 呼び出しに渡すことができる。つまり、後続の CORBA 初期化呼び出しは、その ORB 上で呼び出すことができる。

      この場合、org.omg.CORBA.ORBClass プロパティは、com.iona.corba.art.artimpl.ORBImpl に設定しなければならない。

    初期化された ORB を JNDI 呼び出しに渡す方法については、JDK のマニュアルで JNDI に関する説明を参照してください。

    IONAorb クラスを使うこともできます。IONAorbcom.iona.corba.art.artimpl.ORBImpl (ORBIX ORB クラス) から派生し、set_parameters メソッドをオーバーロードします。set_parameters メソッドでは、ORBname プロパティが読み込まれ、ORB.init 呼び出しに渡されます。

  3. クライアントのインターセプタ名 iASClientInterceptor を、ORBIX のコンフィグレーションファイルの client_binding_list に適切な範囲で追加します。追加したインターセプタ名の範囲がグローバルでない場合は、プロパティ ORBname を値 orbname に設定します。詳細は、ORBIX のマニュアルを参照してください。次のようにします。

    binding:client_binding_list = ["OTS+POA_Coloc", "POA_Coloc", "OTS+TLS_Coloc+POA_Coloc", "TLS_Coloc+POA_Coloc", "iASClientInterceptor+GIOP+IIOP", "OTS+GIOP+IIOP", "GIOP+IIOP", "OTS+GIOP+IIOP_TLS", "GIOP+IIOP_TLS"];



    "iASClientInterceptor+GIOP+IIOP" エントリは、"OTS+GIOP+IIOP" エントリの前に指定する必要があります。



  4. portable_interceptororb_plugins リストに適切な範囲で追加します。

    追加する前は、次のようになっています。

    orb_plugins=["iiop_profile","giop" ,"iiop", "ots"]

    追加した後は、次のようになります。

    orb_plugins=["iiop_profile","giop" ,"iiop", "ots", "portable_interceptor"]

    インターセプタ名と portable_interceptor は、同じ範囲で追加する必要があります。

  5. セキュリティを有効にするには、com.netscape.ejb.client.IUserPrincipal インタフェースを実装して、クラスファイル名をプロパティ com.netscape.ejb.client.PrincipalClass に指定する必要があります。



    org.omg.CORBA.ORBClass プロパティが com.iona.corba.art.artimpl.ORBImpl に設定されている場合は、システムプロパティに com.netscape.ejb.client.PrincipalClass プロパティを設定する必要があります。このプロパティは、プログラムから渡すことはできません。




RMI/IIOP クライアントアプリケーションの実行

クライアントが Java main プログラムであり、クライアント環境が正しく設定され、互換性のある JVM を使う限り、main クラスを実行するだけで十分です。IIOP URL コンポーネント (ホストおよびポート番号) をコマンドラインで渡すか、またはプロパティファイルからこの情報を取得するかによって、main プログラムの実行方法は異なります。たとえば、ConverterClient サンプルは次の方法で実行します。

java j2eeguide.converter.ConverterClient host_name port

host_name は、IIOP ブリッジが指定された port でリッスンするときのホストの名前です。


RMI/IIOP クライアントアプリケーションのトラブルシューティング

RMI/IIOP クライアントを実行すると、クライアント上でエラーが発生する場合があります。IIOP ブリッジログを表示するには、「RMI/IIOP ログメッセージの表示」を参照してください。表 10-1 には、共通する RMI/IIOP 設定上の問題の一般的な症状および修正方法が一覧表示されています。

負荷状態の RMI/IIOP クライアントアプリケーションを実行中に問題が発生した場合は、負荷関連の問題のトラブルシューティング方法を調べて、「パフォーマンス問題の認識」を参照してください。


表 10-1    トラブルシューティング 

症状

問題の原因

対処法

クライアントが JNDI 検索時に次の例外をスローする

org.omg.CORBA.INITIALIZE:can't instantiate default ORB implementation  

クライアントの CLASSPATH に iasclient.jar ファイルが含まれていない

クライアントの PATH が適切な Java コマンドを取得しない。アプリケーションサーバにバンドルされた JVM、または適切な既存の JVM を使う  

クライアントの設定手順が正しく行われていることを確認する。「クライアントの設定」を参照  

クライアントに CORBA 通信失敗例外が発生する

javax.naming.CommunicationException:Cannot connect to ORB.Root exception is org.omg.CORBA.COMM_FAILURE:  

次のどれかの原因による IIOP ブリッジへのコネクションの失敗

  • IIOP ホストまたはポート番号が不正である

  • IIOP ブリッジプロセスが開始されていない

  • IIOP ブリッジプロセスは開始されているが、初期化が行われていない

  • クライアントマシンがネットワークにアクセスできない

  • ファイヤウォールルールにより、アプリケーションサーバシステムにアクセスできない

 

IIOP ブリッジプロセスが設定され、開始されていることを確認する。「サーバの設定」を参照

クライアントマシン上にネットワークアクセスが設定され、中間ファイヤウォールによってアクセスが阻止されていないことを確認する  

a) クライアントがハングしたようになり、メモリ不足例外が発生する

Exception in thread "main" java.lang.OutOfMemoryError.

b) IIOP ブリッジが次のどれかの例外を繰り返しスローする

名前が見つからない

[01/May/2001 08:20:14:4] info:GDS-007:finished a registry load [01/May/2001 08:20:14:6] info:PROT-006:new connection established SendRemoteReq status=0x0 javax.naming.NameNotFoundException:EjbContext:exception on getHome(), com.nets cape.server.eb.UncheckedException:unchecked exception thrown by impl com.kivasoft.eb.boot.EBBootstrapImpl@1fca24a; nested exception is:

クラスが見つからない

[24/Jan/2001 12:25:52:9] error:EBFP-unserialize:error during unserialization of method, exception = java.lang.ClassNotFoundException:j2eeguide.confirmer.ejb_stub_ConfirmerHome java.lang.ClassNotFoundException:j2eeguide.confirmer.ejb_stub_ConfirmerHome at java.lang.Throwable.fillInStackTrace(Native Method)

クラスタイプ変換の例外  

クライアントアプリケーションで指定されている JNDI 名が正しくない

または

(SP3 以前) 展開された EJB JAR ディレクトリがサーバの CLASSPATH に追加されていない。または、EJB JAR ディレクトリを CLASSPATH に追加してからサーバを再起動していない  

クライアントが使う JNDI 名を修正する

または

アプリケーションサーバの CLASSPATH を設定する  

クライアントアプリケーションでネーミングの通信例外が発生する

javax.naming.CommunicationException  

アプリケーションサーバに関連付けられている Directory Server が動作しない  

Directory Server を起動する  


RMI/IIOP のパフォーマンスチューニング

RMI/IIOP パスで多数の同時ユーザに対応しなければならない配置環境の場合は、この節で説明するチューニングガイドラインを試してください。RMI/IIOP を使う場合、JVM のデフォルト設定とその基本 OS だけでは最適なパフォーマンスおよび容量を達成できません。

この節には次のトピックがあります。


負荷テストの方法

RMI/IIOP 用の負荷テストツールはわずかしかないため、基本的な負荷テスト用の比較的単純なドライバを独自に作成することができます。次の Java メインプログラムは、Converter EJB の単純な負荷テストクライアントの例を示しています。

サンプルコード...


パフォーマンス問題の認識

RMI/IIOP クライアントアプリケーションを負荷状態で実行する前に、基本構造のテストが成功していることを確認してください。

負荷状態のクライアントアプリケーションの実行を開始する際、RMI/IIOP クライアントに次の例外が発生する場合があります。

org.omg.CORBA.COMM_FAILURE

java.lang.OutOfMemoryError

java.rmi.UnmarshalException

アプリケーションの基本構造は正しく動作することが確認されている場合に、アプリケーションの負荷テスト時にこれらの例外が発生した場合は、次の節で説明する RMI/IIOP 環境のチューニング方法を参照してください。


基本的なチューニング方法

次に説明するチューニング方法を試し、ユーザの環境に最適なバランスを見つけてください。


Solaris ファイル記述子の設定
Solaris の場合、ulimit を使って、開いているファイル数のプロパティを最大に設定すると、サポートできる RMI/IIOP クライアントの最大数に影響を与えます。このプロパティのデフォルト値は、Solaris 2.6 または Solaris 8 のどちらを実行しているかによって、64 または 1024 となります。数を増やすには、次のコマンドを /etc/system に追加し、再起動します。

set rlim_fd_max = 8192

次のコマンドを使うと、この使用制限を確認できます。

ulimit -a -H

上記の使用制限を設定後、次のコマンドを使うと、このプロパティの値をこの制限まで明示的に増やすことができます。

ulimit -n 8192

次のコマンドを使うと、この制限を確認できます。

ulimit -a

たとえば、ulimit がデフォルトの 64 の場合、1 つのテストドライバがサポートできる同時クライアントは 25 ですが、ulimit8192 に設定すると、同じテストドライバで 120 の同時クライアントをサポートできます。このテストドライバでは複数のスレッドが生成されました。これらの各スレッドは JNDI 検索を実行し、ビジネスメソッド呼び出し間の思考 (遅延) 時間が 500 ミリ秒で同じビジネスメソッドを繰り返し呼び出し、約 100 KB のデータを送受信できました。

これらの設定値は RMI/IIOP クライアント (Solaris)、および Solaris システムにインストールされた IIOP ブリッジに適用されます。ファイル記述子の制限の設定については、Solaris のマニュアルを参照してください。


Java ヒープ設定値
ファイル記述子の容量をチューニングするだけでなく、クライアントおよびブリッジ JVM の両方について異なるヒープ値も設定できます。デフォルトのヒープサイズの変更については、JDK 1.3.1 のマニュアルを参照してください。


スケーラビリティの向上

1 つのブリッジプロセスおよびクライアントシステムの容量をチューニングするだけでなく、複数の IIOP ブリッジプロセスを使うことによって、RMI/IIOP 環境のスケーラビリティを向上させることができます。同じアプリケーションサーバインスタンス上で複数のブリッジプロセスを設定すると、アプリケーション配置のスケーラビリティが向上します。場合によっては、それぞれ 1 つまたは複数のブリッジプロセスを使って設定した多数のアプリケーションサーバインスタンスを使うこともできます。

複数のブリッジプロセスがアクティブな設定では、一連のクライアントをさまざまなブリッジにスタティックにマッピングするか、またはクライアントサイドに独自のロジックを実装して既知のブリッジプロセスと照らし合わせてロードバランスを行うことによって、クライアント負荷を分割できます。


RMI/IIOP のファイヤウォールの設定

RMI/IIOP クライアントがファイヤウォールを通過して iPlanet Application Server と通信する場合は、IIOP ブリッジプロセスが使うクライアントシステムから IIOP ポートへのアクセスを有効にする必要があります。クライアントのポート番号はダイナミックに割り当てられるため、RMI/IIOP トラフィックがクライアントシステムからファイヤウォールを通過してアプリケーションサーバのインスタンスに達するように、ソースポートの範囲を広げ、1 つのデスティネーションポートを開く必要があります。

さらに、Converter サンプルアプリケーションを一度実行すると、2 つのシステム間の IIOP トラフィックが巡回ベースで追跡されます。ホスト swatch は RMI/IIOP クライアントで、ホスト mamba は、デスティネーションシステムまたはアプリケーションサーバシステムです。IIOP ブリッジプロセスに割り当てられたポート番号は 9010 です。ダイナミックに割り当てられた 2 つのポート (33046 および 33048) は RMI/IIOP クライアントで使われます。一方、ブリッジプロセスとの通信にはポート 9010 が使われます。

swatch -> mamba.red.iplanet.com TCP D=9010 S=33046 Syn Seq=140303570 Len=0 Win=24820
Options=<nop,nop,sackOK,mss 1460>
mamba.red.iplanet.com -> swatch TCP D=33046 S=9010 Syn Ack=140303571 Seq=1229729413 Len=0 Win=8760
Options=<mss 1460>
swatch -> mamba.red.iplanet.com TCP D=9010 S=33046 Ack=1229729414 Seq=140303571 Len=0 Win=24820
swatch -> mamba.red.iplanet.com TCP D=9010 S=33046 Ack=1229729414 Seq=140303571 Len=236 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33046 S=9010 Ack=140303807 Seq=1229729414 Len=168 Win=8524
swatch -> mamba.red.iplanet.com TCP D=9010 S=33046 Ack=1229729582 Seq=140303807 Len=0 Win=24820
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Syn Seq=140990388 Len=0 Win=24820
Options=<nop,nop,sackOK,mss 1460>
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Syn Ack=140990389 Seq=1229731472 Len=0 Win=8760
Options=<mss 1460>
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229731473 Seq=140990389 Len=0 Win=24820
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229731473 Seq=140990389 Len=285 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140990674 Seq=1229731473 Len=184 Win=8475
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229731657 Seq=140990674 Len=0 Win=24820
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229731657 Seq=140990674 Len=132 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140990806 Seq=1229731657 Len=25 Win=8343
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229731682 Seq=140990806 Len=0 Win=24820
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229731682 Seq=140990806 Len=124 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140990930 Seq=1229731682 Len=0 Win=8219
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140990930 Seq=1229731682 Len=336 Win=8219
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229732018 Seq=140990930 Len=120 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140991050 Seq=1229732018 Len=0 Win=8099
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140991050 Seq=1229732018 Len=32 Win=8099
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229732050 Seq=140991050 Len=120 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140991170 Seq=1229732050 Len=0 Win=7979
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140991170 Seq=1229732050 Len=32 Win=7979
swatch -> mamba.red.iplanet.com TCP D=9010 S=33046 Fin Ack=1229729582 Seq=140303807 Len=0 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33046 S=9010 Ack=140303808 Seq=1229729582 Len=0 Win=8524
mamba.red.iplanet.com -> swatch TCP D=33046 S=9010 Fin Ack=140303808 Seq=1229729582 Len=0 Win=8524
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Fin Ack=1229732082 Seq=140991170 Len=0 Win=24820
swatch -> mamba.red.iplanet.com TCP D=9010 S=33046 Ack=1229729583 Seq=140303808 Len=0 Win=24820
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Ack=140991171 Seq=1229732082 Len=0 Win=7979
mamba.red.iplanet.com -> swatch TCP D=33048 S=9010 Fin Ack=140991171 Seq=1229732082 Len=0 Win=7979
swatch -> mamba.red.iplanet.com TCP D=9010 S=33048 Ack=1229732083 Seq=140991171 Len=0 Win=24820


RMI/IIOP ログメッセージの表示

RMI/IIOP パスによって生成されたログメッセージは、IIOP ブリッジプロセスによって生成されたログファイルをレビューすることによって監視できます。IIOP ブリッジプロセスは Java エンジン (kjs) 形式なので、Web および EJB コンテナをサポートする Java エンジンを監視する方法と同じ方法で、これらのログを監視します。該当するログファイルを表示するには、IIOP ブリッジの役割を果たす Java エンジンを指定する必要があります。


Windows 上でのログの監視

iPlanet Application Server を Windows にインストールしている場合、デフォルトでは、アプリケーションサーバの起動時、Java エンジンログファイルは自動的には表示されません。コンソールログ情報の自動表示を有効にすると便利です。これを行うには、次の手順を実行します。

  1. 「スタート」>「設定」>「コントロールパネル」を選択します。

  2. 「サービス」をダブルクリックします。

  3. 「iPlanet Application Server 6.5」エントリを選択します。

  4. 「スタートアップ」をクリックします。

  5. 「デスクトップとの対話をサービスに許可」、「OK」の順にクリックします。

  6. アプリケーションサーバを停止するには、「停止」をクリックします。

  7. アプリケーションサーバを起動するには、「開始」をクリックします。

アプリケーションサーバが起動すると、多数の MS DOS 出力ウィンドウがデスクトップに表示されます。アプリケーションサーバの物理プロセスごとに 1 つの出力ウィンドウが表示されます。エンジンが起動したら、Java エンジンを検索し、CXS (ブリッジ) プロセスで定義されているポート番号を指定するエンジンを検索します。

これらの出力ウィンドウの垂直スクロールバーを有効にするには、次の手順を実行します。

  1. 出力ウィンドウの左上隅の MS DOS アイコンを選択します。

  2. 「プロパティ」を選択します。

  3. 「レイアウト」を選択します。

  4. 「画面バッファのサイズの高さ」を 200 または希望の数値に設定します。

  5. このウィンドウを起動するたびにこれらの変更を適用するかどうかを尋ねるプロンプトが表示された場合は、「Yes」をクリックします。


UNIX 上でのログの監視

UNIX では、開発者の多くは、tail -f コマンドを使って、対象プロセスのアプリケーションサーバログファイルを監視します。この方法で Java エンジンログを監視するには、次の手順を実行します。

  1. 次のログディレクトリに移動します。

    cd install_dir/ias/logs

  2. Java エンジン (kjs) の一つおよび実行サービス (kxs) プロセスに対して tail コマンドを実行します。

    tail -f kjs_2*

    監視する適切な Java エンジンログファイルを選択する必要があります。Java エンジンは、管理ツールで定義されている方法に従って番号付けされます。通常、CXS (ブリッジ) プロセスがもっとも番号の大きい Java エンジンログファイルですが、CXS プロセスによって生成されたログファイルを確認するために、ログファイルのポート番号情報を再び確認してください。

  3. tail コマンドを無効にするには、Control + C キーを押します。


RMI/IIOP サンプルアプリケーション

RMI/IIOP 指向サンプルのリストは、Web サーバのドキュメントルートの次の場所、またはアプリケーションサーバのインストールディレクトリの下にあります。

http://webserver_host/ias-samples/ -> RMI/IIOP

install_dir/ias/ias-samples/index.html -> RMI/IIOP


Converter サンプルアプリケーション

Sun の『J2EE 開発者ガイド』の Currency Converter サンプルアプリケーションは iPlanet Application Server にバンドルされています。このサンプルには、アプリケーションを iPlanet Application Server に配置するための詳しいセットアップ手順が追加されています。ほかの RMI/IIOP ベースアプリケーションを配置する前に、このサンプルの詳しいセットアップ手順に従って Converter サンプルを実行することをお勧めします。Currency Converter のセットアップマニュアルおよびソースコードは次の場所にあります。

install_dir/ias/ias-samples/j2eeguide/docs/converter.html

install_dir/ias/ias-samples/j2eeguide/converter/src/


その他の RMI/IIOP サンプルアプリケーション

iPlanet Application Server にバンドルされている『J2EE 開発者ガイド』のほとんどのサンプルには、RMI/IIOP クライアントプログラムが含まれています。これらのプログラムは、EJB 仕様のさまざまな局面を示した比較的簡単なサンプルです。これらのサンプルは次の場所にあります。

install_dir/ias/ias-samples/j2eeguide/docs/index.html



C++ IIOP クライアントアプリケーション (UNIX のみ)



iPlanet Application Server で C++ IIOP ベースのクライアントアプリケーションを使用する方法は、ほかの J2EE 認定アプリケーションサーバでこれらのクライアントを使用する場合とほぼ同じです。クライアントの検索部分に最小限の変更を加えるだけで、クライアントを再利用してさまざまな J2EE アプリケーションサーバと連動させることができます。

この節には次の節があります。


ORBIX 用 C++ IIOP アプリケーションの設定

『管理者ガイド』で説明しているように、iPlanet Application Server で C++ IIOP クライアントを使う前に、ORBIX 2000 をインストールして iPlanet Application Server と統合する必要があります。この節では、ORBIX のソフトウェア要件とその他のマニュアルを示します。


要件

ソフトウェア要件は次のとおりです。

  • Solaris 2.6 +

  • ORBIX 2000 C++ 開発キット、バージョン 1.2+

  • Sun Workshop 6.2 (C++ 5.2)

  • iPlanet Application Server 6.5

  • Java 用 IDL コンパイラ (J2SE 1.3 以前の rmic にはいくつかの問題があるため、J2SE 1.4 Beta またはその他の Java 用 IDL コンパイラの rmic を使用すること)

  • 値渡しのユーザ定義と Java ネイティブの複合データタイプを、C++ に実装する。EJB および C++ クライアント間で値が交換されるデータタイプを、異なる言語間で正しく変換させるには、上記のデータタイプを C++ に実装しなければならない。これは、Java ネイティブおよびユーザ定義のデータタイプに適用される。


参照資料


C++ クライアント開発の準備

C++ クライアントを開発する前に、次の手順を実行します。

  1. 必要なソフトウェアがすべてインストールされていることを確認します。「要件」 を参照してください。

  2. EAR ファイルのスタブとスケルトンが ejbc-iiop オプションを使って生成されていることを確認します。生成されていない場合は、build.xml ファイルを編集して -iiopejbc オプションに追加し、EAR ファイルを再生成します。

  3. EJB を配置します。iPlanet Application Server に組み込まれている J2EE のサンプル (通貨の変換と確認用のサンプルなど) を使うことができます。



    「OMG IDL to Java Language Mapping」に準拠しているため、Java パッケージ名の大文字と小文字は区別されません。パッケージ内のクラス名またはインタフェース名でも、大文字と小文字は区別されません。大文字と小文字だけが異なる Java パッケージ名、クラス名、およびインタフェース名は、エラーとして処理されます。大文字と小文字だけが異なるパッケージ名とクラス名は、Bean に配置しないでください。J2EE のサンプルは、この点に考慮していないため、配置する前に変更する必要があります。この例については、「C++ クライアント用に Converter サンプルを再配置する」を参照してください。




データタイプの前提条件と制約事項

クライアントとサーバ間での値の受け渡しのテストが完了しているデータタイプは、double、int、long、short、float、char、boolean、および byte データタイプだけです。その他の CORBA 標準データタイプでは、IDL から Java/C++ 言語へのマッピングが完了していることを前提としています。java.lang.BigDecimal を渡すと、NO_IMPLEMENT 例外がスローされます。

その他の値渡しのデータタイプ (HashTable などのカスタム Java クラス) の場合は、C++ 固有の実装を使用するか、既存のクラス (STL など) の C++実装を Java クラス用に生成された IDL に変換するラッパーを作成する必要があります。


IDL ファイルの生成

次の 2 つの方法で、IDL ファイルを生成できます。


J2SE 1.4 rmic 2 を使用する

J2SE 1.4 の rmic を使うには、次の手順で行います。

  1. C++ クライアントの開発用に新しいディレクトリを作成します。次のようにします。

    mkdir cppclient
    cd cppclient

  2. rmic を実行します。たとえば、次の方法で実行します (改行しない)。

    rmic -classpath ias_inst_dir/ias/APPS/j2eeguide-myconverter/j2eeguide-myconverterEjb: ias_inst_dir/ias/classes/java/javax.jar -idl j2eeguide.myconfirmer.Confirmer

    次の処理も実行します (改行しない)。

    rmic -classpath ias_inst_dir/ias/APPS/j2eeguide-myconverter/j2eeguide-myconverterEjb: ias_inst_dir/ias/classes/java/javax.jar -idl j2eeguide.myconfirmer.ConfirmerHome

  3. IDL ファイルを移動します。次のようにします。

    mv j2eeguide/myconverter/Converter.idl
    mv j2eeguide/myconverter/ConverterHome.idl

  4. 生成された 2 つの IDL を結合します。次のようにします。

    1. cat ConverterHome.idl >> Converter.idl

    2. Converter.idl を編集して、j2eeguidemyconverter モジュール、および ConverterConverterHome インタフェースを宣言する行と、それらに対応する #pragma 宣言以外の行をすべて削除します。

    3. IDL ファイルの先頭に次の行を追加します。

         #include <omg/orb.idl>
         #include "ejb.idl"
         #include "_std_java.idl"

    最終 IDL ファイルの出力です。確認してください。

    #include <omg/orb.idl>
    #include "ejb.idl"
    #include "_std_java.idl"
    module j2eeguide {
       module myconverter {
           interface Converter : ::javax::ejb::EJBObject {
              double dollarToYen(in double arg0) ;
              double yenToEuro(in double arg0) ;
           };
           #pragma ID Converter
           "RMI:j2eeguide.myconverter.Converter:0000000000000000"
           interface ConverterHome : ::javax::ejb::EJBHome {
              Converter create() raises(::javax::ejb::CreateEx);
           };
           #pragma ID ConverterHome
       "RMI:j2eeguide.myconverter.ConverterHome:0000000000000000"
       };
    };

  5. 生成された _std_java.idl ファイルと ejb.idl ファイルを cppclient ディレクトリにコピーします。


OpenORB JavaToIDL コンパイラを使用する

openorb JavaToIdl ツールを使って、生成された openorb JAR ファイル (openorb_rmi-1.0.1.jar および openorb_tools-1.0.1.jar) を現在のディレクトリにコピーします。たとえば、次の方法で実行します (改行しない)。

java -cp openorb_rmi-1.0.1.jar:openorb_tools-1.0.1.jar:ias_inst_dir/ias/APPS/ j2eeguide-myconverter/j2eeguide-myconverterEjb: ias_inst_dir/ias/classes/java/javax.jar org.openorb.rmi.compiler.JavaToIdl j2eeguide.myconverter.Converter

次の処理も実行します (改行しない)。

java -cp openorb_rmi-1.0.1.jar:openorb_tools-1.0.1.jar:ias_inst_dir/ias/APPS/ j2eeguide-myconverter/j2eeguide-myconverterEjb: ias_inst_dir/ias/classes/java/javax.jar org.openorb.rmi.compiler.JavaToIdl j2eeguide.myconverter.ConverterHome


IDL ファイルから CPP ファイルへの変換

.idl ファイルから .cpp ファイルを生成するには、次の手順で行います。

  1. 次のコマンドを実行して、ORBIX 環境設定スクリプトを生成します。

    . orbix_inst_dir/bin/domain_env

    次のようにします。

    . /opt/iona/bin/localhost_env

  2. 次のコマンドを実行します (改行しない)。

    orbix_inst_dir/bin/idlgen cpp_poa_genie.tcl -ns -all -complete Confirmer.idl -I. -I orbix_inst_dir/orbix_art/1.2/idl

  3. makefile を編集して、値 IT_PRODUCT_DIR をインストールに適用できる値に変更します。

  4. CXXFLAGS-I を設定します。

  5. PATH をエクスポートして、パスの先頭に workshop6 bin ディレクトリを含めます。

  6. 次のコマンドを実行します。エラーが発生しますが、後の手順で修正します。

    make -e

  7. ejb.hh ファイルの CORBA::CORBA に変更します。ただし、ネーム空間 javax::rmi::CORBA に限ります。

  8. EJBMetaDatajavax::ejb::EJBMetaData に変更します。

  9. makefile および client.cxx で、EJBMetaDataImpl を含む行を削除するかコメントにして、コンパイルエラーが発生しないようにします。

  10. client.cxx を次のように編集します。

    1. EJBMetaData を登録する行を、次のようにコメントにします。

         javax_ejb_EJBMetaDataFactory::_register_with_orb(orb);

    2. 次の行を削除します。

         tmp_ref = default_context->resolve_str("IT_GenieDemo");
         CosNaming::NamingContext_var demo_context =
             CosNaming::NamingContext::_narrow(tmp_ref);
         assert(!CORBA::is_nil(demo_context));

    3. 生成されたコードから、ConverterEJBObject、および EJBHome の検索を削除します。次のコメントで識別できます。

      //Exercise interface j2eeguide::myconverter::Converter
      //Exercise interface javax::ejb::EJBObject
      //Exercise interface javax::ejb::EJBHome

    4. 次の行を変更します。

      name = default_context->to_name("j2eeguide_myconfirmer_Confirmer");
      tmp_ref = demo_context->resolve(name);

      次のようにしてください。

      name = default_context->to_name("ejb/MyMyConfirmer");
      tmp_ref = default_context->resolve(name);

    5. 生成されたコードから、関数呼び出し (call_j2eeguide_ で始まる) をコメントにし、create とビジネスメソッドを呼び出すコードを挿入します。次のようにします。

         j2eeguide::myconverter::Converter_var converter =
             ConverterHome4->create();
         CORBA::Double yen = 4000;
         CORBA::Double euro = converter->yenToEuro(yen);

  11. ejbC.cxx を編集して、すべての CORBA::CORBA に変更します。たとえば、次のような正規表現の構文で変更します。

    s/^CORBA/::CORBA/g

    s/ CORBA/ ::CORBA/g

    s/namespace ::CORBA/namespace CORBA/g

    s/¥!CORBA/¥!::CORBA/g

    s/(CORBA/(::CORBA/g

    s/ EJBMetaData/::javax::ejb::EJBMetaData/g

    s/IT_CONST_CAST(::CORBA/IT_CONST_CAST(CORBA/g

  12. ConverterC.cxx ファイルを編集して、操作名を次のパターンの名前に変更します。連続した下線はリテラル文字列です。

    function-name__return-type(pkg1_pkg2_class)__argument-type

    データタイプは Java タイプでなければなりません。たとえば、Java タイプが int の場合、IDL タイプは long ですが、操作で表現されるデータタイプは int でなければなりません。生成された Java スタブ (_Converter_Stub.java など。build.xmlejbc-gs オプションが指定されている場合に生成される) で _request メソッドのパラメータを参照すれば、正確な操作名を取得できます。次のようにします。

    s/"create"/"create__j2eeguide_myconverter_Converter__void"/g
    s/"yenToEuro"/"yenToEuro__double__double"/g
    s/"dollorToYen"/"dollorToYen__double__double"/g

  13. make を実行します。

    make -e client

  14. クライアントを実行します。

    ./client


C++ IIOP アプリケーションのセキュリティの有効化

セキュリティを有効にするには、クライアントアプリケーションを次のライブラリに接続する必要があります。

  • iPlanet Application Server 6.5 に組み込まれている libgxorbixclientinterceptor.so ライブラリ

  • ORBIX に組み込まれている it_portable_interceptor ライブラリ

次の手順で接続します。

  1. クライアントの makefile にある CLIENT_LIBS 行に、次の行を挿入します。

    -lit_portable_interceptor -lgxorbixclientinterceptor

  2. libgxorbixclientinterceptor.so へのパスを makefile の LDLIBS 設定に挿入します。次のようにします。

    -L/space/interceptor ¥

  3. libgxorbixclientinterceptor.so へのパスを LD_LIBRARY_PATH に挿入します。次のようにします。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/space/interceptor

  4. クライアントをリビルドします。

    make -e client

  5. 環境変数 IAS_RC_USERID および IAS_RC_PASSWORD を LDAP ユーザに対応するユーザ ID とパスワードに設定します。シェルから設定するか、putenv 関数を使用します。これらの変数を NULL に設定したり、設定しなかった場合、ユーザ認証が行われず、ロールが割り当てられている Bean にアクセスできません。次のようにします。

    export IAS_RC_USERID=j2ee
    export IAS_RC_PASSWORD=j2ee

  6. ORBIX を統合するための管理者ガイドで説明しているように、クライアントインターセプタとサーバインターセプタを有効にします。

  7. クライアントを実行します。

    ./client


EJB ホームインタフェースの検索

IIOP クライアントのコードを作成するには、最初に EJB のホームインタフェースの検索を実行します。ホームインタフェースの検索を実行する準備として、環境プロパティをいくつか設定する必要があります。次に、EJB の検索名を指定します。次の例に、設定手順を示します。

//ORB を初期化します。
global_orb = CORBA::ORB_init(argc, argv);

// genie デモのネーミングコンテキストを取得します。
tmp_ref = global_orb->resolve_initial_references("NameService");
CosNaming::NamingContext_var default_context =
   CosNaming::NamingContext::_narrow(tmp_ref);
assert(!CORBA::is_nil(default_context));

//ホームを検索します。
name = new CosNaming::Name(2);
name->length(2);
name[0].id = CORBA::string_dup("ejb");
name[0].kind = CORBA::string_dup("");
name[1].id = CORBA::string_dup("MyMyConfirmer");
name[1].kind = CORBA::string_dup("");
tmp_ref = default_context->resolve(name);

j2eeguide::myconfirmer::ConfirmerHome_var ConfirmerHome=j2eeguide::myconfirmer::ConfirmerHome::_narrow(tmp_re f);

//create を呼び出します。
j2eeguide::myconfirmer::Confirmer_var Confirmer=ConfirmerHome->create();

//ビジネスメソッドを呼び出します。
Confirmer->sendNotice(chars);


クライアントサイドのロードバランスおよびフェールオーバー

iPlanet Application Server には IIOP アクセス用のサーバサイドのロードバランスおよびフェールオーバーが用意されていますが、アプリケーションのパフォーマンスおよび可用性をさらに向上させるために、クライアントサイドの方法を実装することも検討してください。

ネーミングサービスでは、名前とオブジェクトを対応付けたリポジトリを定義します。名前とオブジェクトは、1 対 1 で対応付けます。ORBIX 2000 では、ネーミングサービスモデルを拡張し、1 つの名前をオブジェクトのグループに対応付けることができます。オブジェクトグループは、オブジェクトの集合で、サイズを動的に調節できます。オブジェクトグループごとに、選択アルゴリズムを指定します。このアルゴリズムは、オブジェクトグループに関連付けられた名前をクライアントが解決するときに適用されます。次の 3 つのアルゴリズムがサポートされています。

  • ラウンドロビン選択

  • ランダム選択

  • アクティブロードバランス選択

オブジェクトグループを利用すれば、頻繁に要求されるオブジェクトを複製して、リクエストの処理負荷を分散することができます。ネーミングサービスは、オブジェクトグループの選択アルゴリズムに従って、クライアントリクエストを複製されたオブジェクトに転送します。オブジェクトグループは、クライアントに対して透過的です。クライアントは、ほかの名前と同様に、オブジェクトグループの名前を解決します。

フラグ ORBIX_LOADBALANCING=true または falseiasenv.ksh ファイルに設定すると、Java 引数を次のように設定できます。

-DORBIXLoadBalancing=$ORBIX_LOADBALANCING


IIOP ブリッジの設定

iPlanet Application Server をインストールする時点で、IIOP ブリッジプロセスが設定されていない場合は、iPlanet Application Server Administrative Tool を起動して、IIOP ブリッジプロセスをアプリケーションサーバ環境に追加する必要があります。

  1. iPlanet Application Server 管理ツールを起動します。

    install_dir/ias/bin/ksvradmin

  2. アプリケーションサーバインスタンスに接続し、サーバ名アイコンをダブルクリックして、アプリケーションサーバのインスタンスに定義されているプロセスを一覧表示します。少なくとも kjs プロセスが 1 つ、および kxs プロセスが 1 つ表示されます。EJB への IIOP アクセスには、kxs プロセスは不要です。cxs プロセスが表示された場合は、アプリケーションサーバインスタンスにすでに IIOP ブリッジプロセスが定義されています。この場合は、cxs プロセスエントリをダブルクリックし、IIOP ポート番号を書き留め、次の節に進んでください。ブリッジプロセスが表示されない場合は、次の手順に進んでプロセスを定義してください。

  3. 任意の既存プロセスエントリを選択し、「ファイル」>「新規」>「プロセス」を選択します。

  4. プロセスタイプのプルダウンリストから cxs を選択し、kjs および kxs プロセスによってすでに使われているほかのポート番号と競合しないポート番号 (ポート 10822 など) を入力します。システム環境でほかに割り当てられているポートと競合しないかぎり、デフォルトの IIOP ポート番号 (9010) を選択します。「OK」をクリックしてプロセスをインスタンス化します。

  5. 数秒後、アプリケーションサーバ環境で IIOP ブリッジプロセスが動作している状態が表示されます。このプロセスは、Administrative Tool に一覧表示されているその他のすべてのアプリケーションサーバプロセスとともに、アプリケーションサーバの再起動時に自動的に開始されます。

  6. コマンドラインから IIOP ブリッジプロセスの存在も確認できます。たとえば、次のコマンドを入力します (各コマンドはすべて 1 行で指定する)。

    ps -ef | grep iiop

    root 1153 1 0 17:00:15 ?0:00 /bin/sh /usr/iPlanet/ias6/ias/bin/kjs -cset CCS0 -eng 3 -iiop -DORBinsPort=9010

    この出力には、-iiop オプションで開始された iPlanet Java エンジンプロセスが表示されます。このオプションは、Java エンジンのこのインスタンスに、J2EE Web および EJB コンテナプロセスではなく、IIOP ブリッジプロセスとして開始するように指示します。

    cxs プロセスをインスタンス化すると、IIOP サポートのサーバサイドの設定が完了します。


C++ IIOP クライアントアプリケーションの配置

クライアントアプリケーションを開発する場合、開発環境からクライアントシステムに多数のファイルを配置する必要があります。この節では、次の節で説明する IIOP 対応クライアントアプリケーションの配置に必要な、基本手順について説明します。


クライアントの配置

EJB 固有のホームおよびリモートインタフェースとそれらに対応するスタブが、クライアントシステムに配置されていなければなりません。たとえば、Converter サンプルアプリケーションでは、次のクラスをクライアントシステムにコピーする必要があります。

ホームおよびリモートインタフェースクラス

ConverterHome.class

Converter.class

EJB 固有の iPlanet クライアントスタブ

_Converter_Stub.class

_ConverterHome_Stub.class


サーバの CLASSPATH の設定 (SP2 以前)

この節の記述は、iPlanet Application Server 6.0 Service Pack 2 (SP2) 以前に適用されます。Service Pack 3 以降には、次の設定手順は不要です。SP 3 以降を使う場合は、次の節に進んでください。

iPlanet Application Server Service Pack 2 以前で EJB クラスを読み込むには、IIOP ブリッジプロセスが、アプリケーションサーバの CLASSPATH を使って EJB スタブとホーム/リモートインタフェースにアクセスできるようになっている必要があります。IIOP ベースの Java アプリケーションクライアントを SP 2 以前で初めて実行する場合は、まずアプリケーションサーバの CLASSPATH を変更する必要があります。

iPlanet Application Server 6.0 SP2 以降、EJB ベースアプリケーションを登録すると EJB JAR ファイルがアプリケーションサーバの配置ディレクトリに展開されるようになりました。デフォルトでは、j2eeguide-converter.ear などの J2EE アプリケーションをアプリケーションサーバに配置すると、j2eeguideEjb.jar などの組み込み EJB JAR ファイルが次のディレクトリに展開されます。

install_dir/ias/APPS/j2eeguide-converter/j2eeguide-converterEjb/

スタンドアロン EJB JAR モジュール (または WAR モジュール) を iPlanet Application Server に配置する場合、このスタンドアロンモジュールのデフォルトの展開場所は次のディレクトリになります。

install_dir/ias/APPS/modules/j2eeguide-converterEjb/

C++ IIOP クライアントを実行する前に、適切なモジュールディレクトリをアプリケーションサーバの CLASSPATH に追加する必要があります。


IIOP のパフォーマンスチューニング

IIOP パスで多数の同時ユーザに対応しなければならない配置環境の場合は、この節で説明するチューニングガイドラインを試してください。IIOP を使う場合、JVM のデフォルト設定とその基本 OS だけでは最適なパフォーマンスおよび容量を達成できません。

この節には次のトピックがあります。


基本的なチューニング方法

次に説明するチューニング方法を試し、ユーザの環境に最適なバランスを見つけてください。


Solaris ファイル記述子の設定
Solaris の場合、ulimit を使って、開いているファイル数のプロパティを最大に設定すると、サポートできる IIOP クライアントの最大数に影響を与えます。このプロパティのデフォルト値は、Solaris 2.6 または Solaris 8 のどちらを実行しているかによって、64 または 1024 となります。数を増やすには、次のコマンドを /etc/system に追加し、再起動します。

set rlim_fd_max = 8192

次のコマンドを使うと、この使用制限を確認できます。

ulimit -a -H

上記の使用制限を設定後、次のコマンドを使うと、このプロパティの値をこの制限まで明示的に増やすことができます。

ulimit -n 8192

次のコマンドを使うと、この制限を確認できます。

ulimit -a

たとえば、ulimit がデフォルトの 64 の場合、1 つのテストドライバがサポートできる同時クライアントは 25 ですが、ulimit8192 に設定すると、同じテストドライバで 120 の同時クライアントをサポートできます。このテストドライバでは複数のスレッドが生成されました。これらの各スレッドは JNDI 検索を実行し、ビジネスメソッド呼び出し間の思考 (遅延) 時間が 500 ミリ秒で同じビジネスメソッドを繰り返し呼び出し、約 100 KB のデータを送受信できました。

これらの設定値は IIOP クライアント (Solaris)、および Solaris システムにインストールされた IIOP ブリッジに適用されます。ファイル記述子の制限の設定については、Solaris のマニュアルを参照してください。


スケーラビリティの向上

1 つのブリッジプロセスおよびクライアントシステムの容量をチューニングするだけでなく、複数の IIOP ブリッジプロセスを使うことによって、IIOP 環境のスケーラビリティを向上させることができます。同じアプリケーションサーバインスタンス上で複数のブリッジプロセスを設定すると、アプリケーション配置のスケーラビリティが向上します。場合によっては、それぞれ 1 つまたは複数のブリッジプロセスを使って設定した多数のアプリケーションサーバインスタンスを使うこともできます。

複数のブリッジプロセスがアクティブな設定では、一連のクライアントをさまざまなブリッジにスタティックにマッピングするか、またはクライアントサイドに独自のロジックを実装して既知のブリッジプロセスと照らし合わせてロードバランスを行うことによって、クライアント負荷を分割できます。


IIOP ログメッセージの表示

IIOP パスによって生成されたログメッセージは、IIOP ブリッジプロセスによって生成されたログファイルをレビューすることによって監視できます。IIOP ブリッジプロセスは Java エンジン (kjs) 形式なので、Web および EJB コンテナをサポートする Java エンジンを監視する方法と同じ方法で、これらのログを監視します。該当するログファイルを表示するには、IIOP ブリッジの役割を果たす Java エンジンを指定する必要があります。

開発者の多くは、tail -f コマンドを使って、対象プロセスのアプリケーションサーバログファイルを監視します。この方法で Java エンジンログを監視するには、次の手順を実行します。

  1. 次のログディレクトリに移動します。

    cd install_dir/ias/logs

  2. Java エンジン (kjs) の一つおよび実行サービス (kxs) プロセスに対して tail コマンドを実行します。

    tail -f kjs_2*

    監視する適切な Java エンジンログファイルを選択する必要があります。Java エンジンは、管理ツールで定義されている方法に従って番号付けされます。通常、CXS (ブリッジ) プロセスがもっとも番号の大きい Java エンジンログファイルですが、CXS プロセスによって生成されたログファイルを確認するために、ログファイルのポート番号情報を再び確認してください。

  3. tail コマンドを無効にするには、Control + C キーを押します。


C++ IIOP サンプルアプリケーション

Sun の『J2EE 開発者ガイド』の Currency Converter サンプルアプリケーションは iPlanet Application Server にバンドルされています。このサンプルには、アプリケーションを iPlanet Application Server に配置するための詳しいセットアップ手順が追加されています。ほかの IIOP ベースのアプリケーションを配置する前に、このサンプルの詳しいセットアップ手順に従って Converter サンプルを実行することをお勧めします。Currency Converter のセットアップマニュアルおよびソースコードは次の場所にあります。

install_dir/ias/ias-samples/j2eeguide/docs/converter.html

install_dir/ias/ias-samples/j2eeguide/converter/src/


C++ クライアント用に Converter サンプルを再配置する

Bean を配置するときには、パッケージ名とクラス名の大文字と小文字は区別されません。このため、次の手順に従って、C++ IIOP クライアント用に Converter サンプルを再配置する必要があります。ほかのサンプルを再配置するときにも、この手順を適用できます。

  1. cd ias_inst_dir/ias/ias-samples/j2eeguide

  2. cp -R converter myconverter

  3. cd myconverter/src

  4. 次の表に示すように、build.xmlejb-jar.xmlweb.xmlapplication.xml、および schema/*.xml ファイルの、パッケージなどの名前を変更します。


    表 10-2    Converter サンプルの XML ファイルの変更

    名前を変更する要素

    変更前

    変更後

    パッケージ名  

    converter  

    myconverter  

    appnamedisplay-name、および context-root  

    j2eeguide-converter  

    j2eeguide-myconverter  

    ejb-name および ejb-link  

    MyConverter  

    MyMyConverter  

  5. 次のコマンドを実行します。

    ias_inst_dir/ias/bin/kguidgen

  6. 生成された guid をコピーし、ias-ejb-jar.xml ファイルの <guid> セクションにある guid 値を置換します。

  7. 次のコマンドを再度実行します。

    ias_inst_dir/ias/bin/kguidgen

  8. 生成された guid をコピーし、ias-web.xml ファイルの <guid> セクションにある guid 値を置換します。

  9. mv j2eeguide/converter j2eeguide/myconverter

  10. cd j2eeguide/myconverter

  11. Java ファイルをすべて変更して、パッケージ名の変更 (converter から myconverter への変更など) を反映し、ConverterClient.java の検索名を MyConverter から MyMyConverter に変更します。

  12. cd ../..

  13. ias_inst_dir/ias/bin/build

  14. cd ../assemble/ear

  15. ias_inst_dir/ias/bin/iasdeploy deployapp j2eeguide-myconveter.ear

  16. iPlanet Application Server 6.0 SP2 以前のバージョンの場合は、以下の追加手順を実行してください。

    1. ias_inst_dir/ias/bin/kjs スクリプトを編集して、新しいディレクトリ ias_inst_dir/ias/APPS/j2eeguide-myconverter/j2eeguide-myconverterEjb をクラスパスに追加します。

    2. iPlanet Application Server を再起動します。


前へ     目次     索引     DocHome     次へ     
Copyright © 2002 Sun Microsystems, Inc. All rights reserved.

最新更新日 2002 年 3 月 6 日