Oracle® Fusion Middleware Oracle WebLogic Server RMIのプログラミング 11gリリース1 (10.3.6) B61626-06 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic Serverで使用するためのRMIのプログラミングに必要なWebLogic RMIの機能とガイドラインについて説明します。
WebLogic RMIはクライアントとサーバーのフレームワークに分けられています。実行時のクライアントはサーバーのソケットを持たないため、接続をリスニングしていません。クライアントはサーバーを介して接続を取得します。サーバーだけがクライアントのソケットを認識します。このため、クライアントにあるリモート・オブジェクトをホストする場合、クライアントはWebLogic Serverに接続していなければなりません。WebLogic Serverはクライアントへのリクエストを処理して、クライアントへ情報を渡します。つまり、クライアント側のRMIオブジェクトには、クラスタ内であっても単一のWebLogic Serverを介してのみアクセスできます。クライアント側のRMIオブジェクトがJNDIネーミング・サービスにバインドされている場合、そのオブジェクトへのアクセスは、そのバインドを実行したサーバーにアクセスできる場合に限り可能です。
WebLogic Serverは認証、認可、およびJava EEのセキュリティ・サービスを実装しています。詳細については、WebLogicセキュリティのプログラミングを参照してください。
WebLogic Serverでは、Java Platform, Enterprise Edition (Java EE)プログラミング・モデルのトランザクションがサポートされています。WebLogic RMIアプリケーションでのトランザクションの使用の詳細は、以下を参照してください。
『Oracle WebLogic Server JTAのプログラミング』のWebLogic Server RMIアプリケーションのトランザクションに関する項では、WebLogic RMIアプリケーションでのトランザクションの仕組みについて説明します。
『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
オプションを指定します(表4-1「WebLogic RMIコンパイラのオプション」を参照)。例:
$ java weblogic.rmic -clusterable classes
詳細は、『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 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コンソールで定義された名前で固有に識別されます。これらの名前は、メソッド・ルーターがサーバーを識別するための名前となります。
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.rmic
を使って、レプリケートされないスタブをクラスタ内に生成することもできます。このようなスタブは、「固定」サービスと呼ばれています。これらのスタブは登録されたホストからのみ使用可能であり、透過的なフェイルオーバーやロード・バランシングは提供しません。固定サービスはレプリケートされたクラスタ全体のJNDIツリーにバインドされるので、クラスタ全体で使用可能になります。ただし、固定サービスをホストする各サーバーが故障しても、クライアントは別のサーバーにフェイルオーバーすることはできません。
特定のRMIオブジェクトのレプリケートされないスタブを生成するには、WebLogic RMIコンパイラの-clusterable
オプションは指定しません(表4-1「WebLogic RMIコンパイラのオプション」を参照)。例:
$ java weblogic.rmic classes
動的プロキシまたはプロキシは、リモート・オブジェクトのクライアントで使用されるクラスです。このクラスには、実行時にクラスが作成されたときに指定されるインタフェースのリストが実装されます。RMIでは、動的に生成されたバイトコードとプロキシ・クラスが使用されます。プロキシ・クラスは、クライアントのJava仮想マシン(JVM)で呼び出されるインスタンスです。プロキシ・クラスは、呼び出されたメソッド名とその引数をマーシャリングして、リモートのJVMに転送します。リモート呼出しが終了して戻された後に、プロキシ・クラスはクライアント上でその結果のマーシャリングを解除します。生成されたバイトコード(リモートJVMに存在)は、リモートJVM上で呼び出されたメソッドと引数のマーシャリングを解除し、リモート・オブジェクトのインスタンスのメソッドを呼び出した後、結果をマーシャリングしてクライアントに戻します。
WebLogic Serverでは、同期リモート呼出しのタイムアウトを指定できます。タイムアウトを指定すると、リモート呼出しを行ったRMIクライアントは、呼び出したリモート・メソッドがサーバー・インスタンスを通じてレスポンスを戻す前に、復帰することができます。この機能は、リモート・システムからレスポンスがない場合はクライアントがすばやく復帰するのが望ましいレガシー・アプリケーションで便利です。「RMIタイムアウトの使用に関するガイドライン」を参照してください。
同期RMIタイムアウトを実装するには、weblogic-ejb-jar.xml
にあるremote-client-timeout
デプロイメント記述子要素を使用します。詳細は、『Oracle WebLogic Server WebLogic Enterprise JavaBeansのプログラミング』のweblogic-ejb-jar.xmlデプロイメント記述子のリファレンスに関する項を参照してください。