BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic RMI プログラマーズ ガイド

 Previous Next Contents PDF で侮ヲ  

WebLogic RMI の機能とガイドライン

以下の節では、WebLogic Server で使用するための RMI のプログラミングで用いる WebLogic RMI の機能について説明します。

 


WebLogic RMI フレームワーク

WebLogic RMI はクライアントとサーバのフレームワークに分けられています。実行時のクライアントはサーバのソケットを持たないため、接続をリスンしていません。クライアントはサーバを介して接続を取得します。サーバだけがクライアントのソケットを認識します。このため、クライアントにあるリモート オブジェクトをホストする場合、クライアントは WebLogic Server に接続していなければなりません。WebLogic Server はクライアントへのリクエストを処理して、クライアントへ情報を渡します。つまり、クライアントサイドの RMI オブジェクトには、クラスタ内であっても単一の WebLogic Server を介してのみアクセスできます。クライアント サイドの RMI オブジェクトが JNDI ネーミング サービスにバインドされている場合、そのオブジェクトへのアクセスは、そのバインドを実行したサーバにアクセスできる場合に限り可能です。

 


WebLogic RMI コンパイラ

WebLogic RMI コンパイラ(weblogic.rmic)は、リモート オブジェクトを生成しコンパイルするためのコマンド ライン ユーティリティです。weblogic.rmic では、クライアントサイドでカスタム リモート オブジェクト インタフェースのための動的プロキシを生成し、サーバサイド オブジェクトにホット コード生成を提供します。

動的プロキシ クラスは、クライアントに渡されるシリアライズ可能クラスです。クライアントは、WebLogic RMI レジストリでクラスをルックアップすることによって、そのクラスのプロキシを取得します。クライアントは、あたかもローカルなクラスであるかのようにプロキシのメソッドを呼び出します。プロキシは、要求をシリアライズして WebLogic Server に送ります。

ホット コード生成では、クライアント上の動的プロキシからの要求を処理する、サーバサイドのクラスのバイト コードを作成します。動的に生成されたバイトコードは、クライアント要求をデシリアライズし、実装クラスに対して実行します。次に結果をシリアライズしてクライアントのプロキシへ送り返します。クラスの実装は、Weblogic Server の WebLogic RMI レジストリ内の名前に関連付けられます。

RMI オブジェクトがデプロイされている場合、weblogic.rmic を実行すると、プロキシ クラスが自動的に作成され、実行時にホット コード生成機能によってバイトコードが動的に生成されます。weblogic.rmicの使い方については、「手順4.実装クラスを RMI コンパイラでコンパイルする」を参照してください。weblogic.rmicのコマンドライン オプションの一覧については、WebLogic RMI コンパイラのオプションを参照してください。

注意: クラスタ対応クライアントまたは IIOP クライアントの場合は、明示的に weblogic.rmic を実行するだけです(WebLogic RMI over IIOP を使用すると、クライアントは、Internet Inter-ORB Protocol(IIOP)を介して RMI リモート オブジェクトにアクセスできるため、RMI プログラミング モデルが拡張されます)。RMI over IIOP の使用方法の詳細については、『WebLogic RMI over IIOP プログラマーズ ガイド』を参照してください。

スタブとスケルトンから動的プロキシとバイトコードへの移行

WebLogic Server 6.1 より前のバージョンでは、weblogic.rmic を実行すると、クライアントにはスタブが、サーバサイドにはスケルトン コードが生成されました。今回のバージョンでは、クライアント サイドで生成されていたスタブは動的プロキシに、サーバサイドのスケルトンはバイトコードに置き換えられています。これにより、クラスの生成が不要になりました。

バージョン 6.1 より前の WebLogic RMI オブジェクトをバージョン 6.1 以降の WebLogic Server で実行できるようにするには、それらのオブジェクトに対して weblogic.rmic を再度実行します。これにより、必要なプロキシおよびバイトコードが生成され、デプロイ済みの RMI オブジェクトが有効になります。動的プロキシの詳細については、RMI の動的プロキシを参照してください。

リモート オブジェクトが EJB の場合は、weblogic.ejbc を再度実行すると、バージョン 6.1 より前の WebLogic Server オブジェクトがバージョン 6.1 以降で動作するようになります。weblogic.ejbc の使用方法の詳細については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。

リモート オブジェクトに対して、-oneway、-clusterable、-stickToFirstServer のうちの 1 つまたは複数のパラメータを使用して weblogic.rmic を再度実行するか、または weblogic.ejbc を再度実行すると、そのオブジェクトのデプロイメント記述子が生成されます。

WebLogic RMI コンパイラのオプション

WebLogic RMI コンパイラは、Java コンパイラがサポートしているオプションをすべて受け入れます。たとえば、コマンド ラインのコンパイラ オプションに -d \classes examples.hello.HelloImpl を追加できます。ほかにも、Java コンパイラがサポートしているすべてのオプションを使用でき、これらのオプションは直接 Java コンパイラに渡されます。

次の表に、java weblogic.rmic オプションを示します。これらのオプションは、java weblogic.rmic の後、リモート クラス名の前に入力します。

表2-1 WebLogic RMI コンパイラのオプション

オプション

説明

-help

オプションの説明を表示する。

-version

バージョン情報を出力する。

-dispatchPolicy <queueName>

サービスが WebLogic Server の実行スレッドを取得するために使う、コンフィグレーション済みの実行キューを指定する。詳細については、「実行キューによるスレッド使用の制御」を参照。

-idl

リモート インタフェース用の IDL を生成する。

-idlOverwrite

既存の IDL ファイルを上書きする。

-idlVerbose

IDL情報についての冗長な情報を表示する。

-idlStrict

OMG 規格に従って IDL を生成する。

-idlNoFactories

値型 (value type) のファクトリ メソッドを生成しない。

-idlDirectory <idlDirectory>

IDL ファイルを作成するディレクトリを指定する(デフォルトはカレント ディレクトリ)。

-clusterable

そのサービスをクラスタ化可能(WebLogic Server クラスタ内の複数のサーバがホストできる)として指定する。各ホスティング オブジェクト、またはレプリカは、共通名でネーミング サービスにバインドされる。そのサービス スタブがネーミング サービスから取り出される場合、それはレプリカのリストを保持するレプリカ対応参照を含み、レプリカ間のロード バランシングやフェイルオーバを行う。

-loadAlgorithm <algorithm>

-clusterable と組み合わせた場合だけ使用可能。ロード バランシングおよびフェイルオーバに使用する特定のアルゴリズムのサービスを指定する(デフォルトは weblogic.cluster.loadAlgorithm)。ラウンドロビン、ランダム、重みベースの中から 1 つ選択できる。

-callRouter <callRouterClass>

-clusterable と組み合わせた場合だけ使用可能。ルーティング メソッド呼び出し用に使われるクラスを指定する。このクラスは weblogic.rmi.cluster.CallRouter を実装する必要がある。指定した場合、各メソッド呼び出しの前にそのクラスのインスタンスが呼び出され、そのメソッド パラメータに基づいてルーティングするサーバを指定できる。サーバ名または null が返される。null は現在のロード アルゴリズムが使用されることを示す。

-stickToFirstServer

-clusterable と組み合わせた場合だけ使用可能。セッション維持型ロード バランシングを有効にする。最初の要求をサービスするために選ばれたサーバが、後続のすべての要求にも使用される。

-methodsAreIdempotent

-clusterable と組み合わせた場合だけ使用可能。このクラスのメソッドが多重呼び出し不変であることを示す。これにより、リモート メソッドが呼び出される前に起きた障害かどうか保証できなくても、通信障害があれば、スタブはその復旧を試みることができるようになる。デフォルトでは(このオプションが使われなければ)、スタブはリモート メソッドが呼び出された前に起きたことが保証されている障害に関してだけ再試行する。

-replicaListRefreshInterval <seconds>

-clusterable と組み合わせた場合だけ使用可能。クラスタのレプリカ リストをリフレッシュする試みの最小間隔を指定する(デフォルトは 180 秒)。

-iiop

サーバから IIOP スタブを生成する。

-iiopDirectory

IIOP プロキシ クラスが作成されるディレクトリを指定する。

-commentary

注釈を出力する。

-nomanglednames

コンパイル時にリモート クラスに固有のプロキシが作成される。

-keepgenerated

WebLogic RMI コンパイラを実行するときに、生成したスタブ クラス ファイルとスケルトン クラス ファイルのソースを保持できる。

クラスタ内のレプリケーションされないスタブ

weblogic.rmic を使って、レプリケートされないスタブをクラスタ内に生成することもできます。このようなスタブは、「固定」サービスと呼ばれています。これらのスタブは登録されたホストからのみ使用可能であり、透過的なフェイルオーバやロード バランシングは提供しません。固定サービスはレプリケートされたクラスタ全体の JNDI ツリーにバインドされるので、クラスタ全体で使用可能になります。固定サービスをホストする各サーバが故障しても、クライアントは別のサーバにフェイルオーバすることはできません。

WebLogic RMI コンパイラのその他の機能

WebLogic RMI コンパイラには、他にも以下のような機能があります。

 


RMI の動的プロキシ

動的プロキシまたはプロキシは、リモート オブジェクトのクライアントが使用するクラスです。このクラスは、作成されるときに、実行時に指定されたインタフェースのリストを実装します。

RMI では、動的に生成されたバイトコードとプロキシ クラスが使用されます。プロキシ クラスは、クライアントの Java 仮想マシン(JVM)で呼び出されるインスタンスです。プロキシ クラスは、呼び出されたメソッド名とその引数をマーシャリングして、リモートの JVM に転送します。リモート呼び出しが終了して返された後に、プロキシ クラスはクライアント上でその結果のマーシャリングを解除します。生成されたバイトコードはリモート JVM に存在し、リモート JVM 上で呼び出されたメソッドと引数のマーシャリングを解除し、リモート オブジェクトのインスタンスのメソッドを呼び出した後、結果をマーシャリングしてクライアントに返します。

WebLogic RMI コンパイラとプロキシの使い方

WebLogic RMI コンパイラは、デフォルトの動作により、リモート インタフェース用のプロキシと、そのプロキシを共有するリモート クラス用のプロキシを作成します。プロキシは、リモート オブジェクトのクライアントが使用するクラスです。RMI では、動的に生成されたバイトコードとプロキシ クラスが使用されます。

たとえば、WebLogic RMI コンパイラでは、example.hello.HelloImplcounter.example.CiaoImpl は、一対のプロキシ クラスとバイトコード、つまりリモート オブジェクト(このサンプルでは example.hello.Hello)によって実装されたリモート インタフェースに適合するプロキシで表わされます。

リモート オブジェクトが複数のインタフェースを実装する場合、プロキシの名前とパッケージは 1 組のインタフェースをエンコードすることによって決定されます。WebLogic RMI コンパイラの -nomanglednames というオプションを使って、デフォルトの動作をオーバーライドできます。このオプションを使用すると、コンパイル時にリモート クラスに固有のプロキシが作成されます。クラス固有のプロキシが検出された場合は、そのプロキシはインタフェース固有のプロキシに優先します。

さらに、WebLogic RMI のプロキシ クラスでは、プロキシは final ではありません。同じ場所に配置されたリモート オブジェクトへの参照は、プロキシではなくオブジェクトそのものへの参照です。

 


ホット コード生成

rmic を実行すると、WebLogic Server のホット コード生成機能により、メモリ内にサーバ クラス用のバイトコードが自動生成されます。バイトコードは、リモート オブジェクトの必要に応じて、動的に生成されます。現在のバージョンの WebLogic Server では、weblogic.rmic を実行しても、オブジェクトのスケルトン クラスは生成されません。

 


RMI と T3 プロトコル

WebLogic Server の RMI 通信では T3 プロトコルが使用されます。このプロトコルは、WebLogic Server と他の Java プログラム (クライアントやその他の WebLogic Server を含む) との間のデータ転送用に最適化されたプロトコルです。サーバ インスタンスは、接続先の各 Java 仮想マシン (JVM) を追跡し、JVM のすべてのトラフィックを転送するための T3 接続を作成します。

たとえば、Java クライアントが WebLogic Server 上のエンタープライズ Bean および JDBC 接続プールにアクセスすると、1 つのネットワーク接続が WebLogic Server の JVM とクライアントの JVM との間に確立されます。T3 プロトコルは 1 つの接続上のパケットを見えない形で多重化するため、EJB および JDBC のサービスでは、専用のネットワーク接続を単独で使用しているかのように記述することができます。

2 つのサーバ インスタンスや 1 つのサーバ インスタンスと 1 つの Java クライアントなど、T3 接続された任意の 2 つの Java プログラムは、定期的にポイントツーポイントの「ハートビート」を使用して、使用可能な状態であることを通知および判定します。各エンド ポイントは定期的にハートビートをピアに送るとともに、ピアから継続してハートビートを受け取ることでピアが使用可能な状態であると判定します。

サーバ インスタンスがハートビートを送る頻度は、ハートビート間隔 (デフォルトでは 60 秒) で決まります。

ピアからのハートビートがある回数届かなかないと、サーバ インスタンスはピアが使用不可の状態であると判定します。この回数は、ハートビート周期 (デフォルトは 4) によって決まります。

したがって、各サーバ インスタンスは、ピアをアクセス不能であると判定するまでに、ピアからメッセージ (ハートビートまたは他の通信) のない状態で最大 240 秒 (4 分) 待ちます。

タイムアウトのデフォルト値は変更しないことをお勧めします。

 

Back to Top Previous Next