WebLogic RMI プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
以下の節では、WebLogic Server で使用するための RMI のプログラミングに必要な WebLogic RMI の機能とガイドラインについて説明します。
WebLogic RMI はクライアントとサーバのフレームワークに分けられています。実行時のクライアントはサーバのソケットを持たないため、接続をリスンしていません。クライアントはサーバを介して接続を取得します。サーバだけがクライアントのソケットを認識します。このため、クライアントにあるリモート オブジェクトをホストする場合、クライアントは WebLogic Server に接続していなければなりません。WebLogic Server はクライアントへのリクエストを処理して、クライアントへ情報を渡します。つまり、クライアントサイドの RMI オブジェクトには、クラスタ内であっても単一の WebLogic Server を介してのみアクセスできます。クライアント サイドの RMI オブジェクトが JNDI ネーミング サービスにバインドされている場合、そのオブジェクトへのアクセスは、そのバインドを実行したサーバにアクセスできる場合に限り可能です。
WebLogic Server は認証、認可、および J2EE のセキュリティ サービスを実装しています。詳細については、『WebLogic Security プログラミングの概要』の「Introduction to Programing WebLogic Security」を参照してください。
WebLogic Server では、Sun Microsystems の JavaTM 2 Platform, Enterprise Edition (J2EE) プログラミング モデルのトランザクションがサポートされています。WebLogic RMI アプリケーションでのトランザクションの使用の詳細については、以下を参照してください。
以下の節では、WebLogic Server でサポートされる RMI オブジェクトのフェイルオーバとロード バランシングについて説明します。
クラスタ化された RMI アプリケーションのフェイルオーバは、オブジェクトのレプリカ対応スタブを使用して行われます。クライアントがレプリカ対応スタブを通じて障害が発生したサービスに対して呼び出しを行うと、スタブはその障害を検出し、別のレプリカに対してその呼び出しを再試行します。
クライアントで J2EE サービスを利用できるようにするために、WebLogic は、特定のサービスの RMI スタブを、特定の名前で JNDI ツリーにバインドします。RMI オブジェクトの他のインスタンスがクラスタ内の他のサーバにデプロイされると、RMI スタブはその場所で更新されます。クラスタ内のサーバに障害が発生すると、他のサーバの JNDI ツリー内の RMI スタブが更新されてサーバの障害を反映します。
特定の RMI オブジェクトのレプリカ対応スタブを生成するには、WebLogic RMI コンパイラの -clusterable オプションを指定します。次に例を示します。
$ java weblogic.rmic -clusterableclasses
詳細については、『WebLogic Server クラスタ ユーザーズ ガイド』の「EJB と RMI のレプリケーションとフェイルオーバ」を参照してください。
RMI オブジェクトのロード バランシング アルゴリズムは、クラスタ化されたオブジェクトで取得されるレプリカ対応スタブに保持されます。特定の RMI オブジェクトに対するロード バランシング アルゴリズムは、WebLogic RMI コンパイラの -loadAlgorithm <algorithm> オプションを使用して指定します。オブジェクトにコンフィグレーションしたロード バランシング アルゴリズムは、クラスタのデフォルトのロード バランシング アルゴリズムをオーバーライドします。WebLogic Server RMI コンパイラでは、以下のロード バランシング アルゴリズムをサポートしています。
詳細については、『WebLogic Server クラスタ ユーザーズ ガイド』の「EJB と RMI オブジェクトのロード バランシング」を参照してください。
パラメータベースのルーティングでは、ロード バランシング動作をより詳細なレベルで制御できます。クラスタ化されたオブジェクトを、weblogic.rmi.cluster.CallRouter
インタフェースを使用して CallRouter に割り当てることができます。これはパラメータにより各呼び出しの前に呼び出されるクラスです。CallRouter はそのパラメータを自由に調べ、呼び出しの送り先となるネーム サーバを返します。
weblogic.rmi.cluster.CallRouter
.
Class java.lang.Object
Interface weblogic.rmi.cluster.CallRouter
(extends java.io.Serializable)
パラメータベースのルーティングを可能にするには、このインタフェースを実装するクラスを RMI コンパイラ (rmic
) に与えなければなりません。以下のオプションを使って (すべて 1 行に入力します)、サービス実装時に rmic
を実行します。
$ java weblogic.rmic -clusterable -callRouter <callRouterClass> <remoteObjectClass>
リモート メッセージが呼び出されるたびに、クラスタ化可能なスタブからコール ルータを呼び出します。コール ルータは、その呼び出しの宛先のサーバの名前を返します。
クラスタ内の各サーバは、WebLogic Server Console で定義された名前でユニークに識別されます。これらの名前は、メソッド ルータがサーバを識別するための名前となります。
例 : ExampleImpl
というクラスを例に説明します。このクラスは、メソッド foo
でリモート インタフェース Example を実装します。
public class ExampleImpl implements Example {
public void foo(String arg) { return arg; }
}
この CallRouter
を実装した ExampleRouter
では、'arg' < "n" の場合にすべての foo
呼び出しが server1 (server1 に届かない場合は server3) に送られ、'arg' >= "n" の場合にすべての呼び出しが server2 (server2 に届かない場合は server3) に送られます。
public class ExampleRouter implements CallRouter {
private static final String[] aToM = { "server1", "server3" };
private static final String[] nToZ = { "server2", "server3" };
public String[] getServerList(Method m, Object[] params) {
if (m.GetName().equals("foo")) {
if (((String)params[0]).charAt(0) < 'n') {
return aToM;
} else {
return nToZ;
}
} else {
return null;
}
}
}
次の rmic
呼び出しは、ExampleRouter
と ExampleImpl
を関連付けて、パラメータベースのルーティングを有効にします。
$ rmic -clusterable -callRouter ExampleRouter ExampleImpl
オブジェクトがレプリカを呼び出している同じサーバ インスタンス上にレプリカがある場合、ローカル レプリカを使用する方が効率的なので、その呼び出しはロード バランシングの対象にはなりません。詳細については、『WebLogic Server クラスタ ユーザーズ ガイド』の「連結されたオブジェクトの最適化」を参照してください。
weblogic.rmic
を使って、レプリケートされないスタブをクラスタ内に生成することもできます。このようなスタブは、「固定」サービスと呼ばれています。これらのスタブは登録されたホストからのみ使用可能であり、透過的なフェイルオーバやロード バランシングは提供しません。固定サービスはレプリケートされたクラスタ全体の JNDI ツリーにバインドされるので、クラスタ全体で使用可能になります。固定サービスをホストする各サーバが故障しても、クライアントは別のサーバにフェイルオーバすることはできません。
特定の RMI オブジェクトのレプリケートされないスタブを生成する場合は、WebLogic RMI コンパイラの -clusterable オプションは指定しません。次に例を示します。
$ java weblogic.rmicclasses
動的プロキシまたはプロキシは、リモート オブジェクトのクライアントが使用するクラスです。このクラスには、実行時にクラスが作成されたときに指定されるインタフェースのリストが実装されます。RMI では、動的に生成されたバイトコードとプロキシ クラスが使用されます。プロキシ クラスは、クライアントの Java 仮想マシン (JVM) で呼び出されるインスタンスです。プロキシ クラスは、呼び出されたメソッド名とその引数をマーシャリングして、リモートの JVM に転送します。リモート呼び出しが終了して返された後に、プロキシ クラスはクライアント上でその結果のマーシャリングを解除します。生成されたバイトコードはリモート JVM に存在し、リモート JVM 上で呼び出されたメソッドと引数のマーシャリングを解除し、リモート オブジェクトのインスタンスのメソッドを呼び出した後、結果をマーシャリングしてクライアントに返します。
WebLogic Server では、同期リモート呼び出しのタイムアウトを指定できます。タイムアウトを指定すると、リモート呼び出しを行った RMI クライアントは、呼び出したリモート メソッドがサーバ インスタンスを通じて応答を返す前に、復帰することができます。この機能は、リモート システムから応答がない場合はクライアントがすばやく復帰するのが望ましいレガシー アプリケーションで便利です。「RMI タイムアウトの使用に関するガイドライン」を参照してください。
同期 RMI タイムアウトを実装するには、weblogic-ejb-jar.xml
で remote-client-timeout
デプロイメント記述子要素を使用します。詳細については、『WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』の「weblogic-ejb-jar.xml デプロイメント記述子のリファレンス」を参照してください。
![]() ![]() |
![]() |
![]() |