Oracle® Fusion Middleware Oracle WebLogic Server RMI プログラマーズ ガイド 11g リリース 1 (10.3.1) B55530-01 |
|
戻る |
次へ |
以下の節では、WebLogic Server で使用するための RMI のプログラミングに必要な WebLogic RMI の機能とガイドラインについて説明します。
WebLogic RMI はクライアントとサーバのフレームワークに分けられています。実行時のクライアントはサーバのソケットを持たないため、接続をリスンしていません。クライアントはサーバを介して接続を取得します。サーバだけがクライアントのソケットを認識します。このため、クライアントにあるリモート オブジェクトをホストする場合、クライアントは WebLogic Server に接続していなければなりません。WebLogic Server はクライアントへのリクエストを処理して、クライアントへ情報を渡します。つまり、クライアントサイドの RMI オブジェクトには、クラスタ内であっても単一の WebLogic Server を介してのみアクセスできます。クライアントサイドの RMI オブジェクトが JNDI ネーミング サービスにバインドされている場合、そのオブジェクトへのアクセスは、そのバインドを実行したサーバにアクセスできる場合に限り可能です。
WebLogic Server は認証、認可、および Java EE のセキュリティ サービスを実装しています。詳細については、『WebLogic Security プログラマーズ ガイド』を参照してください。
WebLogic Server では、Sun Microsystems の Java Platform、Enterprise Edition (Java EE) プログラミング モデルのトランザクションがサポートされています。WebLogic RMI アプリケーションでのトランザクションの使用の詳細については、以下を参照してください。
『Oracle Fusion Middleware Oracle WebLogic Server JTA プログラマーズ ガイド』の「WebLogic Server RMI アプリケーションのトランザクション」では、WebLogic RMI アプリケーションでのトランザクションの仕組みについて説明します。
『Oracle Fusion Middleware Oracle WebLogic Server JTA プログラマーズ ガイド』の「RMI アプリケーションのトランザクション」では、WebLogic Server の RMI アプリケーションでトランザクションを実装する場合の一般的なガイドラインを示します。
以下の節では、WebLogic Server でサポートされる RMI オブジェクトのフェイルオーバとロード バランシングについて説明します。
クラスタ化された RMI アプリケーションのフェイルオーバは、オブジェクトのレプリカ対応スタブを使用して行われます。クライアントがレプリカ対応スタブを通じて障害が発生したサービスに対して呼び出しを行うと、スタブはその障害を検出し、別のレプリカに対してその呼び出しを再試行します。
クライアントで Java EE サービスを利用できるようにするために、WebLogic は、特定のサービスの RMI スタブを、特定の名前で JNDI ツリーにバインドします。RMI オブジェクトの他のインスタンスがクラスタ内の他のサーバにデプロイされると、RMI スタブはその場所で更新されます。クラスタ内のサーバに障害が発生すると、他のサーバの JNDI ツリー内の RMI スタブが更新されてサーバの障害を反映します。
特定の RMI オブジェクトのレプリカ対応スタブを生成するには、WebLogic RMI コンパイラの -clusterable
オプションを指定します。たとえば、
$ java weblogic.rmic -clusterable classes
詳細については、『Oracle Fusion Middleware Oracle WebLogic Server クラスタの使い方』の「EJB と RMI のレプリケーションとフェイルオーバ」を参照してください。
RMI オブジェクトのロード バランシング アルゴリズムは、クラスタ化されたオブジェクトで取得されるレプリカ対応スタブに保持されます。特定の RMI オブジェクトに対してロード バランシング アルゴリズムを、WebLogic RMI コンパイラの -loadAlgorithm <algorithm>
オプションを使用して指定します。オブジェクトにコンフィグレーションしたロード バランシング アルゴリズムは、クラスタのデフォルトのロード バランシング アルゴリズムをオーバーライドします。WebLogic Server RMI コンパイラでは、以下のロード バランシング アルゴリズムをサポートしています。
たとえば、RMI オブジェクトのロード バランシングをラウンドロビンに設定するには、次の rmic
オプションを使用します。
$ java weblogic.rmic -clusterable -loadAlgorithm round-robin classes
RMI オブジェクトのロード バランシングを重みベースのサーバ アフィニティに設定するには、次の rmic
オプションを使用します。
$ java weblogic.rmic -clusterable -loadAlgorithm weight-based -stickToFirstServer classes
詳細については、『Oracle fusion Middleware Oracle 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
オブジェクトがレプリカを呼び出している同じサーバ インスタンス上にレプリカがある場合、ローカル レプリカを使用する方が効率的なので、その呼び出しはロード バランシングの対象にはなりません。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server クラスタの使い方』での「連結されたオブジェクトの最適化」を参照してください。
weblogic.rmic
を使って、レプリケートされないスタブをクラスタ内に生成することもできます。このようなスタブは、「固定」サービスと呼ばれています。これらのスタブは登録されたホストからのみ使用可能であり、透過的なフェイルオーバやロード バランシングは提供しません。固定サービスはレプリケートされたクラスタ全体の JNDI ツリーにバインドされるので、クラスタ全体で使用可能になります。ただし、固定サービスをホストする各サーバが故障しても、クライアントは別のサーバにフェイルオーバすることはできません。
特定の RMI オブジェクトのレプリケートされないスタブを生成する場合は、WebLogic RMI コンパイラの -clusterable
オプションは指定しません。たとえば、
$ java weblogic.rmic classes
動的プロキシまたはプロキシは、リモート オブジェクトのクライアントで使用されるクラスです。このクラスには、実行時にクラスが作成されたときに指定されるインタフェースのリストが実装されます。RMI では、動的に生成されたバイトコードとプロキシ クラスが使用されます。プロキシ クラスは、クライアントの Java 仮想マシン (JVM) で呼び出されるインスタンスです。プロキシ クラスは、呼び出されたメソッド名とその引数をマーシャリングして、リモートの JVM に転送します。リモート呼び出しが終了して返された後に、プロキシ クラスはクライアント上でその結果のマーシャリングを解除します。生成されたバイトコードはリモート JVM に存在し、リモート JVM 上で呼び出されたメソッドと引数のマーシャリングを解除し、リモート オブジェクトのインスタンスのメソッドを呼び出した後、結果をマーシャリングしてクライアントに返します。
WebLogic Server では、同期リモート呼び出しのタイムアウトを指定できます。タイムアウトを指定すると、リモート呼び出しを行った RMI クライアントは、呼び出したリモート メソッドがサーバ インスタンスを通じて応答を返す前に、復帰することができます。この機能は、リモート システムから応答がない場合はクライアントがすばやく復帰するのが望ましいレガシー アプリケーションで便利です。「RMI タイムアウトの使用に関するガイドライン」を参照してください。
同期 RMI タイムアウトを実装するには、weblogic-ejb-jar.xml
で remote-client-timeout
デプロイメント記述子要素を使用します。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server Enterprise JavaBeans プログラマーズ ガイド』の「weblogic-ejb-Jar.Xml Elements」を参照してください。