WebLogic RMI プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
すべてのリモート オブジェクトの基本単位は java.rmi.Remote
インタフェースで、これにはメソッドが含まれていません。この「タグ付け」インタフェースを拡張し (リモート クラスを識別するタグとして機能するように)、リモート オブジェクトの構造を作成するメソッド スタブを使って、使用するリモート インタフェースを作成します。次に、リモート クラスを使ってリモート インタフェースを実装します。この実装はレジストリ内の名前にバインドされ、クライアントやサーバはそこからオブジェクトをルックアップしてリモートで使用できます。
既に RMI クラスを記述している場合は、リモート インタフェースとそれを拡張するクラスで import 文を変えるだけで WebLogic RMI をインストールできます。クライアント アプリケーションにリモート呼び出しを追加するには、レジストリ内でオブジェクトを名前でルックアップします。WebLogic RMI 例外は java.rmi 例外と同じ機能を備えているので、既存のインタフェースと実装で例外の処理方法を変える必要がありません。
以下の節では WebLogic Server RMI の実装方法について説明します。
独自の WebLogic RMI クラスを簡単な手順で記述できます。次に、その単純な例を示します。
リモートで呼び出せるすべてのクラスは、リモート インタフェースを実装します。Java コードのテキスト エディタを使用し、以下のガイドラインに従ってリモート インタフェースを記述します。
RuntimeException
を拡張することも可能です。WebLogic RMI は、サブクラス java.rmi.RemoteException
を作成するため、既存の RMI クラスがある場合は、例外処理を変更する必要がありません。JavaSoft の RMI では、リモート インタフェースを実装するすべてのクラスには、コンパイル済みのプロキシが存在しなければなりません。WebLogic RMI は、柔軟性の高い実行時のコード生成をサポートします。つまり、WebLogic RMI は、型さえ正しければ、そのほかはインタフェースを実装するクラスに依存しない動的プロキシと動的に生成されるバイトコードもサポートします。クラスが 1 つのリモート インタフェースを実装する場合、コンパイラが生成したプロキシとバイトコードは、リモート インタフェースと同じ名前になります。クラスが複数のリモート インタフェースを実装する場合、コード生成の結果できるプロキシとバイトコードの名前は、コンパイラが使う名前の区切り方によって変わります。
Java コードのテキスト エディタを使用して、リモートで呼び出されるクラスを記述します。このクラスは、手順 1 で記述したリモート インタフェースを実装する必要があります。これは、インタフェースに含まれるメソッド シグネチャを実装したことを意味します。現在のリリースでは、WebLogic RMI で行われるコード生成はこのクラス ファイルに依存します。
WebLogic RMI では、クラスは JavaSoft RMI で必須の UnicastRemoteObject を拡張する必要はありません (UnicastRemoteObject を拡張することはできますが、必須ではありません)。このため、アプリケーションに適用しやすいクラス階層を維持できます。
注意 : WebLogic Server では、Weblogic RMI と標準の JDK RMI の両方を使用できます。WebLogic RMI を使用する場合は、rmic コンパイラとして「java weblogic.rmic ...」を使用する必要があり、RMI 実装を「java.rmi.server.UnicastRemoteObject」のサブクラスとして作成してはなりません。標準の JDK RMI を使用する場合は、rmic コンパイラとして「%JAVA_HOME%\bin\rmic」を使用し、RMI 実装を「java.rmi.server.UnicastRemoteObject」のサブクラスとして作成する必要があります。
クラスは、複数のリモート インタフェースを実装できます。また、クラスにはリモート インタフェースにないメソッドも定義できますが、このようなメソッドはリモートで呼び出せません。
次の例では、複数の HelloImpls を作成するクラスを実装し、それぞれをレジストリ内の固有の名前にバインドします。メソッド sayHello() は、ユーザに「Hello」とあいさつし、リモートで呼び出されたオブジェクトを識別します。
package examples.rmi.multihello;
import java.rmi.*;
public class HelloImpl implements Hello {
private String name;
public HelloImpl(String s) throws RemoteException {
name = s;
}
public String sayHello() throws RemoteException {
return "Hello!From " + name;
}
次に、リモート オブジェクトのインスタンスを作成する main() メソッドを記述し、それを名前 (オブジェクトの実装を指し示す URL) にバインドすることによって WebLogic RMI のレジストリに登録します。リモートでオブジェクトを使用するためにプロキシを取得しようとするクライアントは、オブジェクトを名前でルックアップできます。
次に、HelloImpl クラス用の main() メソッドの例を示します。この例では、WebLogic Server レジストリに HelloRemoteWorld という名前で HelloImpl オブジェクトを登録します。
public static void main(String[] argv) {
// 以下のコードは WebLogic RMI では不要
// System.setSecurityManager(new RmiSecurityManager());
// しかし、このコードを含める場合には、以下のように
// 条件文にする必要がある
// if (System.getSecurityManager() == null)
// System.setSecurityManager(new RmiSecurityManager());
int i = 0;
try {
for (i = 0; i < 10; i++) {
HelloImpl obj = new HelloImpl("MultiHelloServer" + i);
Context.rebind("//localhost/MultiHelloServer" + i, obj);
System.out.println("MultiHelloServer" + i + " created.");
}
System.out.println("Created and registered " + i +
" MultiHelloImpls.");
}
catch (Exception e) {
System.out.println("HelloImpl error: " + e.getMessage());
e.printStackTrace();
}
}
WebLogic RMI では、アプリケーションにセキュリティを統合するためにセキュリティ マネージャを設定する必要はありません。セキュリティは、WebLogic の SSL と ACL のサポートによって処理されます。必要な場合は独自のセキュリティ マネージャを使うこともできますが、それを WebLogic Server にインストールしないでください。
javac または他の Java コンパイラを使用して .java ファイルをコンパイルし、リモート インタフェースとそれを実装するクラス用の .class ファイルを作成します。
リモート クラスに対して WebLogic RMI コンパイラ (weblogic.rmic
) を実行し、動的プロキシとバイトコードを動的に生成します。プロキシは、リモート オブジェクト用のクライアントサイド プロキシで、個々の WebLogic RMI 呼び出しを対応するサーバサイド バイトコードに転送します。サーバサイド バイトコードは、その呼び出しを実際のリモート オブジェクトの実装に転送します。weblogic.rmic
を実行するには、次のコマンド パターンを使用します。
$ java weblogic.rmic nameOfRemoteClass
nameOfRemoteClass
は、リモート インタフェースを実装するクラスの完全なパッケージ名です。上で使用した例では、このコマンドは次のようになります。
$ java weblogic.rmic examples.rmi.hello.HelloImpl
スタブまたはスケルトン クラスを作成するときに生成されたソースを保持する場合は、weblogic.rmic
を実行するときに -keepgenerated フラグを設定します。使用可能なコマンドライン オプションの一覧については、「WebLogic RMI コンパイラのオプション」を参照してください。
リモート クラス、リモート クラスが実装するインタフェース、およびそのプロキシとバイトコードをコンパイルして WebLogic Server にインストールしたら、Java コードのテキスト エディタを使用し、WebLogic クライアント アプリケーションにコードを追加してリモート クラスのメソッドを呼び出すことができます。
通常、そのためにはコードを 1 行だけ記述します。つまり、リモート オブジェクトへの参照を取得します。これは、Naming.lookup() メソッドで行います。次に、上の例で作成したオブジェクトを使用する短い WebLogic クライアント アプリケーションの例を示します。
package mypackage.myclient;
import java.rmi.*;
public class HelloWorld throws Exception {
// WebLogic のレジストリ内の
// リモート オブジェクトをルックアップする
Hello hi = (Hello)Naming.lookup("HelloRemoteWorld");
// メソッドをリモートで呼び出す
String message = hi.sayHello();
System.out.println(message);
}
この例では、クライアントとして Java アプリケーションを使用しています。
package examples.rmi.hello;
import java.rmi.*;
public interface Hello extends java.rmi.Remote {
String sayHello() throws RemoteException;
}
次に、このインタフェースを実装する HelloImpl クラスの完全なコードを示します。
package examples.rmi.hello;
import java.rmi.*;
public class HelloImpl
// 以下は WebLogic RMI では不要
// extends UnicastRemoteObject
implements Hello {
public HelloImpl() throws RemoteException {
super();
}
public String sayHello() throws RemoteException {
return "Hello Remote World!!";
}
public static void main(String[] argv) {
try {
HelloImpl obj = new HelloImpl();
Naming.bind("HelloRemoteWorld", obj);
}
catch (Exception e) {
System.out.println("HelloImpl error: " + e.getMessage());
e.printStackTrace();
}
}
}
![]() ![]() |
![]() |
![]() |