![]() |
iPlanet Application Server 開発者ガイド |
第 10 章 CORBA ベースクライアントの開発と配置
この章では、iPlanet Application Server 環境内で IIOP (RMI over IIOP または IDL over IIOP) プロトコルを介して EJB にアクセスする方法について説明します。
CORBA クライアントサポートの概要
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.AccessException は java.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 クライアントを使う場合は、次の制約事項があります。
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 クライアントアプリケーションの開発
RMI/IIOP クライアントアプリケーションのパッケージング
ORBIX 用に RMI/IIOP アプリケーションを設定する
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 プロパティを次の形式の値に設定する必要があります。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 サンプルアプリケーション」を参照してください。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 を使用している場合は、クライアントサイドのロードバランスを次のような方法で設定できます。
既知のブリッジのリストから手動で選択する
ラウンドロビン DNS
- クライアントビジネスアプリケーションの代わりに、一連の既知のブリッジホスト名およびポートの組み合わせをラウンドロビン方式で使う wrapper クラスを作成できます。ホスト名/ポートの組み合わせの一つで通信例外が発生した場合、wrapper クラスは、リスト内の次のホスト名/ポートの組み合わせを使います。
- たとえば、リモート IIOP ブリッジに接続できない場合、基本となるクライアントクラスによって次の例外がスローされます。
- クライアントの wrapper コードはこの例外を受け取り、次に使用可能な host_name:port ペアを選択して EJB にアクセスし直します。
- 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 または false を iasenv.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 に含める必要があります。このファイルは、次の場所からクライアント環境にコピーできます。
アプリケーションクライアントコンテナを介してクライアントを呼び出すコマンドは、次のとおりです。
J2EE v1.2 に準拠した EAR ファイルを作成する必要があります。この EAR ファイルには、次のものが必要です。
- install_dir/ias/classes/java/iasacc.jar
- このファイルを CLASSPATH に含めると、クライアントの環境に iasclient.jar ファイルを含める必要はなくなります。
RMI/IIOP クライアントアプリケーションクラス、ホームおよびリモートインタフェース、スタブ
app-client.xml という名前の J2EE v1.2 XML 記述子ファイル。次に例を示します。
iPlanet Application Server 固有の XML 記述子ファイル (通常の名前は ias-app-client.xml)。この記述子によって、EJB 参照が EJB 絶対名にマッピングされます。
- <?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>
J2EE v1.2 XML 記述子ファイル (application.xml)。
- <?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>
- RMI/IIOP クライアントの EAR ファイルの構造に関する詳細については、第 11 章「配置のためのパッケージ化」を参照してください。
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 ブリッジプロセスをアプリケーションサーバ環境に追加する必要があります。
iPlanet Application Server 管理ツールを起動します。
アプリケーションサーバインスタンスに接続し、サーバ名アイコンをダブルクリックして、アプリケーションサーバのインスタンスに定義されているプロセスを一覧表示します。少なくとも kjs プロセスが 1 つ、および kxs プロセスが 1 つ表示されます。EJB への RMI/IIOP アクセスには、kxs プロセスは不要です。cxs プロセスが表示された場合は、アプリケーションサーバインスタンスにすでに IIOP ブリッジプロセスが定義されています。この場合は、cxs プロセスエントリをダブルクリックし、IIOP ポート番号を書き留め、次の節に進んでください。ブリッジプロセスが表示されない場合は、次の手順に進んでプロセスを定義してください。
- UNIX の場合
- install_dir/ias/bin/ksvradmin
- Windows の場合
- 「スタート」>「プログラム」>「iPlanet Application Server」>「iAS Administration Tool」を選択します。
任意の既存プロセスエントリを選択し、「ファイル」>「新規」>「プロセス」を選択します。
プロセスタイプのプルダウンリストから cxs を選択し、kjs および kxs プロセスによってすでに使われているほかのポート番号と競合しないポート番号 (ポート 10822 など) を入力します。システム環境でほかに割り当てられているポートと競合しないかぎり、デフォルトの IIOP ポート番号 (9010) を選択します。「OK」をクリックしてプロセスをインスタンス化します。
数秒後、アプリケーションサーバ環境で IIOP ブリッジプロセスが動作している状態が表示されます。このプロセスは、Administrative Tool に一覧表示されているその他のすべてのアプリケーションサーバプロセスとともに、アプリケーションサーバの再起動時に自動的に開始されます。
UNIX の場合、コマンドラインから IIOP ブリッジプロセスの存在も確認できます。たとえば、次のコマンドを入力します (各コマンドはすべて 1 行で指定する)。
root 1153 1 0 17:00:15 ?0:00 /bin/sh /usr/iPlanet/ias6/ias/bin/kjs -cset CCS0 -eng 3 -iiop -DORBinsPort=9010
クライアントの設定
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 プラットフォームは、アプリケーションサーバをインストールした次の場所にあります。
サーバの JVM 環境をクライアントにコピーするには、次の手順を実行します。
install_dir/ias/usr/ に移動します。
これで、バンドルされている JDK が iPlanet ORB とともにインストールされました。次に、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。java/ ディレクトリ全体をクライアント環境にコピーします。java/ ディレクトリを zip または tar 形式で圧縮し、そのアーカイブファイルをクライアントシステムに転送して選択したディレクトリ内で展開できます。
クライアントの PATH を、client_side_JVM_directory/java/bin を含めるように設定します。
java -fullversion を実行して、適切な JDK (1.3.1) が使われていることを確認します。UNIX の場合は、which java を実行してこの動作を確認します。
既存の 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 配布版をインストールしたディレクトリです。次に例を示します。
iPlanet Application Server の Solaris をインストールしたディレクトリから Solaris クライアントシステムに j2eeorb.jar をコピーします。
これで、iPlanet ORB を使えるように既存の JDK が設定されました。次は、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。
orb.properties ファイルを、iPlanet をインストールした次のディレクトリから
- j2eeorb.jar ファイルをコピーします。
- install_dir/ias/usr/java/jre/lib/ext/j2eeorb.jar
- Solaris クライアントの JDK をインストールしたディレクトリにコピーします。
- $JAVA_HOME/jre/lib/ext
- (削除されるようにするには) 必ず、共有オブジェクトファイルが含まれている sparc/ ディレクトリをこの手順でコピーします。この手順では、iPlanet ORB、固有の直列化ファイル、およびほかのサポートファイルがクライアントにコピーされます。
クライアントアプリケーションが DLL にアクセスできるように PATH を設定します。
- install_dir/ias/usr/java/jre/lib/orb.properties
- クライアントの JDK をインストールした次のディレクトリにコピーします。
- $JAVA_HOME/jre/lib/
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 を使う場合は、クライアントとサーバ間で基本データタイプの値のみが交換できます。
iPlanet ORB を保持するディレクトリをクライアント上に作成します。次のようにします。
これで、iPlanet ORB を使えるように既存の JDK が設定されました。次は、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。Linux システムにインストールされた iPlanet Application Server から、クライアントシステム上の適切なディレクトリ、たとえば、/opt/iplanet/orb/ に次の JAR ファイルをコピーします。
環境を設定します。次のようにします。
iPlanet ORB クラスは、コマンドライン (このコマンドはすべて 1 行で指定する) でプロパティとして指定できます。
- 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
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
Windows 98、NT、または 2000 と Java 1.3.1
このシナリオでは、Windows システム上にすでに Java 1.3.1 環境がインストールされており、この JVM を RMI/IIOP クライアントのプラットフォームとして使うことを前提としています。次の手順では、JAVA_HOME は JDK 1.3.1 配布版をインストールしたディレクトリです。次に例を示します。
iPlanet Application Server の Windows をインストールしたディレクトリから Windows クライアントシステムに j2eeorb.jar をコピーします。
これで、iPlanet ORB を使えるように既存の JDK が設定されました。次は、クライアント環境にいくつかの JAR サポートファイルをインストールする必要があります。「RMI/IIOP クライアントサポートクラスのインストール」に進み、これらの JAR ファイルをインストールします。
orb.properties ファイルを、iPlanet をインストールした次のディレクトリから
- j2eeorb.jar ファイルを、次のディレクトリから
- install_dir¥ias¥usr¥java¥jre¥lib¥ext¥j2eeorb.jar
- クライアントの JDK をインストールした次のディレクトリにコピーします。
- %JAVA_HOME%¥jre¥lib¥ext
固有の直列化 DLL を、iPlanet をインストールした次のディレクトリから クライアントアプリケーションが DLL にアクセスできるように PATH を設定します。
- install_dir¥ias¥usr¥java¥jre¥lib¥orb.properties
- クライアントの JDK をインストールした次のディレクトリにコピーします。
- %JAVA_HOME%¥jre¥lib¥
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.jar、iasclient.jar のコピーと install_dirusr/java/bin/ 内の JVM を参照するだけです。たとえば、ローカルで RMI/IIOP アクセスをテストするには、次のように CLASSPATH 変数を設定します。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 は、手動で変数を設定する必要がないように設定できます。
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 を設定します。適切な 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 は、次に示す設定と異なる場合があります。
/opt/rmi-client/iasclient.jar:/opt/rmi-client/javax.jar:
適切な 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 サンプルアプリケーションでは、次のクラスをクライアントシステムにコピーする必要があります。
配置ツール
配置ツールは、ホームおよびリモートインタフェースと 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 とクライアントサイドのロードバランスについては、「クライアントサイドのロードバランスおよびフェールオーバー」を参照してください。
ORBIX 2000 Programmer's Guide, Java Edition ORBIX 2000 1.2.1 Documentation OpenORB RMI over IIOP Java 2 SDK 1.4 のダウンロード
設定の手順
設定の手順は、ファイルパスの形式を除いて、UNIX と Windows で違いはありません。次の例では、UNIX のファイルパスを使用しています。
ORBIX 2000 バージョン 1.2.1 をインストールします。ライセンスファイルを /etc/opt/iona/ にコピーし、ライセンスをインストールします。『管理者ガイド』および ORBIX のマニュアルを参照してください。
ORBIX ドメインコンフィグレーションファイルを、サーバ上の ORBIX のインストール先 (ネーミングサービスを実行している場所) から別のディレクトリ (たとえば、次のディレクトリ) にコピーします。
事前にパッケージされているサンプルアプリケーションのいずれかをインストールする場合は、ejbc ユーティリティを使用して、スタブとスケルトンを再生成します。ejbc については、「ejbc コンパイラの使用法」を参照してください。
- このファイルには、サーバ上の ORBIX にアクセスするために必要な設定情報が含まれています。クライアントプログラムは、このファイルを使ってネーミングサービスに接続します。
- クライアントとサーバが同じマシン上で動作している場合、このファイルは必要ありません。その場合は、localhost 設定 (デフォルト) が使われます。
アプリケーションに関連付けられたスタブ (*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
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
ORBdomain_name プロパティをサーバの ORBIX コンフィグレーションファイルのドメイン名に設定します。このファイルについては、ORBIX のマニュアルを参照してください。この設定は、次の 2 つの方法で行うことができます。
- iPlanet Application Server がクライアントマシンにインストールされていない場合は、任意の iPlanet Application Server (バージョン 6.5) の javax.jar ファイルをクライアントマシンにコピーして、クラスパスに設定します。
クライアントを実行するときに、Java コマンドラインで ORBdomain_name プロパティを設定する
クライアントプログラムで、ORBdomain_name プロパティを文字列の配列として ORB.init 呼び出しの最初のパラメータに渡す。これにより、ORB が初期化される。初期化された ORB は、JNDI 呼び出しに渡すことができる。つまり、後続の CORBA 初期化呼び出しは、その ORB 上で呼び出すことができる。
- この場合、jdk_inst_dir/jre/lib/orb.properties ファイル内の org.omg.CORBA.ORBClass プロパティは com.iplanet.ias.iona.clientorb.IONAorb に設定する必要がある。さらに、iasclient.jar ファイルを手順 6 に示してあるクラスパスに含めなければならない
orb. ファイル内の次のプロパティを変更します。ファイルは、jdk_ inst_dir/jre/lib にあります。
- 初期化された ORB を JNDI 呼び出しに渡す方法については、JDK のマニュアルで JNDI に関する説明を参照してください。
- IONAorb クラスを使うこともできます。IONAorb は com.iona.corba.art.artimpl.ORBImpl (ORBIX ORB クラス) から派生し、set_parameters メソッドをオーバーロードします。set_parameters メソッドでは、ORBname プロパティおよび ORBdomain_name プロパティが読み込まれ、ORB.init 呼び出しに渡されます。
org.omg.CORBA.ORBSingletonClass=com.iona.corba.art.artimpl.ORBSingleton
セキュリティの有効化
セキュリティを有効にするには、クライアントを起動する前に次の手順を実行します。
次のプロパティに値が設定されていないことを確認します。等号の右辺には、空白にしてください。
org.omg.PortableInterceptor.ORBInitializerClass.com.iplanet.ias.iona. orbinitializers.IONAClientORBInitializerImpl=
ORBname プロパティを、client_interceptor 名が登録されている範囲に含まれる orbname に設定します。この設定は、次の 2 つの方法で行うことができます。
Java コマンドラインで ORBname プロパティを設定する
クライアントプログラムで、ORBname プロパティを文字列の配列として ORB.init 呼び出しの最初のパラメータに渡す。これにより、ORB が初期化される。初期化された ORB は、JNDI 呼び出しに渡すことができる。つまり、後続の CORBA 初期化呼び出しは、その ORB 上で呼び出すことができる。
クライアントのインターセプタ名 iASClientInterceptor を、ORBIX のコンフィグレーションファイルの client_binding_list に適切な範囲で追加します。追加したインターセプタ名の範囲がグローバルでない場合は、プロパティ ORBname を値 orbname に設定します。詳細は、ORBIX のマニュアルを参照してください。次のようにします。
- 初期化された ORB を JNDI 呼び出しに渡す方法については、JDK のマニュアルで JNDI に関する説明を参照してください。
- IONAorb クラスを使うこともできます。IONAorb は com.iona.corba.art.artimpl.ORBImpl (ORBIX ORB クラス) から派生し、set_parameters メソッドをオーバーロードします。set_parameters メソッドでは、ORBname プロパティが読み込まれ、ORB.init 呼び出しに渡されます。
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" エントリの前に指定する必要があります。
portable_interceptor を orb_plugins リストに適切な範囲で追加します。
セキュリティを有効にするには、com.netscape.ejb.client.IUserPrincipal インタフェースを実装して、クラスファイル名をプロパティ com.netscape.ejb.client.PrincipalClass に指定する必要があります。
- 追加する前は、次のようになっています。
- 追加した後は、次のようになります。
orb_plugins=["iiop_profile","giop" ,"iiop", "ots", "portable_interceptor"]
- インターセプタ名と portable_interceptor は、同じ範囲で追加する必要があります。
注 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 クライアントアプリケーションを実行中に問題が発生した場合は、負荷関連の問題のトラブルシューティング方法を調べて、「パフォーマンス問題の認識」を参照してください。
症状
問題の原因
対処法
org.omg.CORBA.INITIALIZE:can't instantiate default ORB implementation
クライアントの CLASSPATH に iasclient.jar ファイルが含まれていない
クライアントの PATH が適切な Java コマンドを取得しない。アプリケーションサーバにバンドルされた JVM、または適切な既存の JVM を使う
クライアントの設定手順が正しく行われていることを確認する。「クライアントの設定」を参照
javax.naming.CommunicationException:Cannot connect to ORB.Root exception is org.omg.CORBA.COMM_FAILURE:
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 に追加してからサーバを再起動していない
RMI/IIOP のパフォーマンスチューニング
RMI/IIOP パスで多数の同時ユーザに対応しなければならない配置環境の場合は、この節で説明するチューニングガイドラインを試してください。RMI/IIOP を使う場合、JVM のデフォルト設定とその基本 OS だけでは最適なパフォーマンスおよび容量を達成できません。
負荷テストの方法
RMI/IIOP 用の負荷テストツールはわずかしかないため、基本的な負荷テスト用の比較的単純なドライバを独自に作成することができます。次の Java メインプログラムは、Converter EJB の単純な負荷テストクライアントの例を示しています。
パフォーマンス問題の認識
RMI/IIOP クライアントアプリケーションを負荷状態で実行する前に、基本構造のテストが成功していることを確認してください。負荷状態のクライアントアプリケーションの実行を開始する際、RMI/IIOP クライアントに次の例外が発生する場合があります。
アプリケーションの基本構造は正しく動作することが確認されている場合に、アプリケーションの負荷テスト時にこれらの例外が発生した場合は、次の節で説明する RMI/IIOP 環境のチューニング方法を参照してください。
基本的なチューニング方法
次に説明するチューニング方法を試し、ユーザの環境に最適なバランスを見つけてください。
Solaris ファイル記述子の設定
Solaris の場合、ulimit を使って、開いているファイル数のプロパティを最大に設定すると、サポートできる RMI/IIOP クライアントの最大数に影響を与えます。このプロパティのデフォルト値は、Solaris 2.6 または Solaris 8 のどちらを実行しているかによって、64 または 1024 となります。数を増やすには、次のコマンドを /etc/system に追加し、再起動します。上記の使用制限を設定後、次のコマンドを使うと、このプロパティの値をこの制限まで明示的に増やすことができます。
たとえば、ulimit がデフォルトの 64 の場合、1 つのテストドライバがサポートできる同時クライアントは 25 ですが、ulimit を 8192 に設定すると、同じテストドライバで 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 エンジンログファイルは自動的には表示されません。コンソールログ情報の自動表示を有効にすると便利です。これを行うには、次の手順を実行します。
「スタート」>「設定」>「コントロールパネル」を選択します。
アプリケーションサーバが起動すると、多数の MS DOS 出力ウィンドウがデスクトップに表示されます。アプリケーションサーバの物理プロセスごとに 1 つの出力ウィンドウが表示されます。エンジンが起動したら、Java エンジンを検索し、CXS (ブリッジ) プロセスで定義されているポート番号を指定するエンジンを検索します。「iPlanet Application Server 6.5」エントリを選択します。
「デスクトップとの対話をサービスに許可」、「OK」の順にクリックします。
これらの出力ウィンドウの垂直スクロールバーを有効にするには、次の手順を実行します。
出力ウィンドウの左上隅の MS DOS アイコンを選択します。
「画面バッファのサイズの高さ」を 200 または希望の数値に設定します。
このウィンドウを起動するたびにこれらの変更を適用するかどうかを尋ねるプロンプトが表示された場合は、「Yes」をクリックします。
UNIX 上でのログの監視
UNIX では、開発者の多くは、tail -f コマンドを使って、対象プロセスのアプリケーションサーバログファイルを監視します。この方法で Java エンジンログを監視するには、次の手順を実行します。
次のログディレクトリに移動します。
Java エンジン (kjs) の一つおよび実行サービス (kxs) プロセスに対して tail コマンドを実行します。
tail コマンドを無効にするには、Control + C キーを押します。
- tail -f kjs_2*
- 監視する適切な Java エンジンログファイルを選択する必要があります。Java エンジンは、管理ツールで定義されている方法に従って番号付けされます。通常、CXS (ブリッジ) プロセスがもっとも番号の大きい Java エンジンログファイルですが、CXS プロセスによって生成されたログファイルを確認するために、ログファイルのポート番号情報を再び確認してください。
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+
iPlanet Application Server 6.5
Java 用 IDL コンパイラ (J2SE 1.3 以前の rmic にはいくつかの問題があるため、J2SE 1.4 Beta またはその他の Java 用 IDL コンパイラの rmic を使用すること)
値渡しのユーザ定義と Java ネイティブの複合データタイプを、C++ に実装する。EJB および C++ クライアント間で値が交換されるデータタイプを、異なる言語間で正しく変換させるには、上記のデータタイプを C++ に実装しなければならない。これは、Java ネイティブおよびユーザ定義のデータタイプに適用される。
OMG IDLto Java Language Mapping ORBIX 2000 Programmer's Reference, C++ Edition ORBIX 2000 Programmer's Guide, Java Edition ORBIX 2000 1.2.1 Documentation OpenORB RMI over IIOP (Java 用 IDL コンパイラがある) Java 2 SDK 1.4 のダウンロード
C++ クライアント開発の準備
C++ クライアントを開発する前に、次の手順を実行します。
必要なソフトウェアがすべてインストールされていることを確認します。「要件」 を参照してください。
EAR ファイルのスタブとスケルトンが ejbc の -iiop オプションを使って生成されていることを確認します。生成されていない場合は、build.xml ファイルを編集して -iiop を ejbc オプションに追加し、EAR ファイルを再生成します。
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 を使うには、次の手順で行います。
C++ クライアントの開発用に新しいディレクトリを作成します。次のようにします。 rmic を実行します。たとえば、次の方法で実行します (改行しない)。
rmic -classpath ias_inst_dir/ias/APPS/j2eeguide-myconverter/j2eeguide-myconverterEjb: ias_inst_dir/ias/classes/java/javax.jar -idl j2eeguide.myconfirmer.Confirmer
IDL ファイルを移動します。次のようにします。 生成された 2 つの IDL を結合します。次のようにします。
- 次の処理も実行します (改行しない)。
rmic -classpath ias_inst_dir/ias/APPS/j2eeguide-myconverter/j2eeguide-myconverterEjb: ias_inst_dir/ias/classes/java/javax.jar -idl j2eeguide.myconfirmer.ConfirmerHome
cat ConverterHome.idl >> Converter.idl
Converter.idl を編集して、j2eeguide と myconverter モジュール、および Converter と ConverterHome インタフェースを宣言する行と、それらに対応する #pragma 宣言以外の行をすべて削除します。
生成された _std_java.idl ファイルと ejb.idl ファイルを cppclient ディレクトリにコピーします。
- 最終 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"
};
};
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 ファイルを生成するには、次の手順で行います。
次のコマンドを実行して、ORBIX 環境設定スクリプトを生成します。 次のコマンドを実行します (改行しない)。
orbix_inst_dir/bin/idlgen cpp_poa_genie.tcl -ns -all -complete Confirmer.idl -I. -I orbix_inst_dir/orbix_art/1.2/idl
makefile を編集して、値 IT_PRODUCT_DIR をインストールに適用できる値に変更します。
PATH をエクスポートして、パスの先頭に workshop6 bin ディレクトリを含めます。
次のコマンドを実行します。エラーが発生しますが、後の手順で修正します。
ejb.hh ファイルの CORBA を ::CORBA に変更します。ただし、ネーム空間 javax::rmi::CORBA に限ります。EJBMetaData を javax::ejb::EJBMetaData に変更します。
makefile および client.cxx で、EJBMetaDataImpl を含む行を削除するかコメントにして、コンパイルエラーが発生しないようにします。
EJBMetaData を登録する行を、次のようにコメントにします。 次の行を削除します。
ejbC.cxx を編集して、すべての CORBA を ::CORBA に変更します。たとえば、次のような正規表現の構文で変更します。生成されたコードから、Converter、EJBObject、および EJBHome の検索を削除します。次のコメントで識別できます。
次の行を変更します。
name = default_context->to_name("j2eeguide_myconfirmer_Confirmer");
tmp_ref = demo_context->resolve(name);
生成されたコードから、関数呼び出し (call_j2eeguide_ で始まる) をコメントにし、create とビジネスメソッドを呼び出すコードを挿入します。次のようにします。
- 次のようにしてください。
name = default_context->to_name("ejb/MyMyConfirmer");
tmp_ref = default_context->resolve(name);
ConverterC.cxx ファイルを編集して、操作名を次のパターンの名前に変更します。連続した下線はリテラル文字列です。
make を実行します。 クライアントを実行します。
- データタイプは Java タイプでなければなりません。たとえば、Java タイプが int の場合、IDL タイプは long ですが、操作で表現されるデータタイプは int でなければなりません。生成された Java スタブ (_Converter_Stub.java など。build.xml の ejbc に -gs オプションが指定されている場合に生成される) で _request メソッドのパラメータを参照すれば、正確な操作名を取得できます。次のようにします。
C++ IIOP アプリケーションのセキュリティの有効化
セキュリティを有効にするには、クライアントアプリケーションを次のライブラリに接続する必要があります。次の手順で接続します。
クライアントの makefile にある CLIENT_LIBS 行に、次の行を挿入します。 libgxorbixclientinterceptor.so へのパスを makefile の LDLIBS 設定に挿入します。次のようにします。 libgxorbixclientinterceptor.so へのパスを LD_LIBRARY_PATH に挿入します。次のようにします。 クライアントをリビルドします。 環境変数 IAS_RC_USERID および IAS_RC_PASSWORD を LDAP ユーザに対応するユーザ ID とパスワードに設定します。シェルから設定するか、putenv 関数を使用します。これらの変数を NULL に設定したり、設定しなかった場合、ユーザ認証が行われず、ロールが割り当てられている Bean にアクセスできません。次のようにします。 ORBIX を統合するための管理者ガイドで説明しているように、クライアントインターセプタとサーバインターセプタを有効にします。
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 または false をiasenv.ksh ファイルに設定すると、Java 引数を次のように設定できます。
-DORBIXLoadBalancing=$ORBIX_LOADBALANCING
IIOP ブリッジの設定
iPlanet Application Server をインストールする時点で、IIOP ブリッジプロセスが設定されていない場合は、iPlanet Application Server Administrative Tool を起動して、IIOP ブリッジプロセスをアプリケーションサーバ環境に追加する必要があります。
iPlanet Application Server 管理ツールを起動します。
アプリケーションサーバインスタンスに接続し、サーバ名アイコンをダブルクリックして、アプリケーションサーバのインスタンスに定義されているプロセスを一覧表示します。少なくとも kjs プロセスが 1 つ、および kxs プロセスが 1 つ表示されます。EJB への IIOP アクセスには、kxs プロセスは不要です。cxs プロセスが表示された場合は、アプリケーションサーバインスタンスにすでに IIOP ブリッジプロセスが定義されています。この場合は、cxs プロセスエントリをダブルクリックし、IIOP ポート番号を書き留め、次の節に進んでください。ブリッジプロセスが表示されない場合は、次の手順に進んでプロセスを定義してください。
任意の既存プロセスエントリを選択し、「ファイル」>「新規」>「プロセス」を選択します。
プロセスタイプのプルダウンリストから cxs を選択し、kjs および kxs プロセスによってすでに使われているほかのポート番号と競合しないポート番号 (ポート 10822 など) を入力します。システム環境でほかに割り当てられているポートと競合しないかぎり、デフォルトの IIOP ポート番号 (9010) を選択します。「OK」をクリックしてプロセスをインスタンス化します。
数秒後、アプリケーションサーバ環境で IIOP ブリッジプロセスが動作している状態が表示されます。このプロセスは、Administrative Tool に一覧表示されているその他のすべてのアプリケーションサーバプロセスとともに、アプリケーションサーバの再起動時に自動的に開始されます。
コマンドラインから IIOP ブリッジプロセスの存在も確認できます。たとえば、次のコマンドを入力します (各コマンドはすべて 1 行で指定する)。
root 1153 1 0 17:00:15 ?0:00 /bin/sh /usr/iPlanet/ias6/ias/bin/kjs -cset CCS0 -eng 3 -iiop -DORBinsPort=9010
C++ IIOP クライアントアプリケーションの配置
クライアントアプリケーションを開発する場合、開発環境からクライアントシステムに多数のファイルを配置する必要があります。この節では、次の節で説明する IIOP 対応クライアントアプリケーションの配置に必要な、基本手順について説明します。
クライアントの配置
EJB 固有のホームおよびリモートインタフェースとそれらに対応するスタブが、クライアントシステムに配置されていなければなりません。たとえば、Converter サンプルアプリケーションでは、次のクラスをクライアントシステムにコピーする必要があります。
サーバの 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 に追加し、再起動します。上記の使用制限を設定後、次のコマンドを使うと、このプロパティの値をこの制限まで明示的に増やすことができます。
たとえば、ulimit がデフォルトの 64 の場合、1 つのテストドライバがサポートできる同時クライアントは 25 ですが、ulimit を 8192 に設定すると、同じテストドライバで 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 エンジンログを監視するには、次の手順を実行します。
次のログディレクトリに移動します。
Java エンジン (kjs) の一つおよび実行サービス (kxs) プロセスに対して tail コマンドを実行します。
tail コマンドを無効にするには、Control + C キーを押します。
- tail -f kjs_2*
- 監視する適切な Java エンジンログファイルを選択する必要があります。Java エンジンは、管理ツールで定義されている方法に従って番号付けされます。通常、CXS (ブリッジ) プロセスがもっとも番号の大きい Java エンジンログファイルですが、CXS プロセスによって生成されたログファイルを確認するために、ログファイルのポート番号情報を再び確認してください。
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 サンプルを再配置する必要があります。ほかのサンプルを再配置するときにも、この手順を適用できます。
cd ias_inst_dir/ias/ias-samples/j2eeguide
次の表に示すように、build.xml、ejb-jar.xml、web.xml、application.xml、および schema/*.xml ファイルの、パッケージなどの名前を変更します。
生成された guid をコピーし、ias-ejb-jar.xml ファイルの <guid> セクションにある guid 値を置換します。 生成された guid をコピーし、ias-web.xml ファイルの <guid> セクションにある guid 値を置換します。
表 10-2    Converter サンプルの XML ファイルの変更
名前を変更する要素
変更前
変更後
mv j2eeguide/converter j2eeguide/myconverter
Java ファイルをすべて変更して、パッケージ名の変更 (converter から myconverter への変更など) を反映し、ConverterClient.java の検索名を MyConverter から MyMyConverter に変更します。
ias_inst_dir/ias/bin/iasdeploy deployapp j2eeguide-myconveter.ear
iPlanet Application Server 6.0 SP2 以前のバージョンの場合は、以下の追加手順を実行してください。
前へ 目次 索引 DocHome 次へ
Copyright © 2002 Sun Microsystems, Inc. All rights reserved.
最新更新日 2002 年 3 月 6 日