ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     WebLogic RMI   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

WebLogic RMI の実装

 

以下の節では、WebLogic RMI API について説明します。

 


WebLogic RMI API の概要

WebLogic RMI の一部として、いくつかのパッケージが WebLogic Server に付属しています。パブリック API には以下のものが含まれています。

既に RMI クラスを記述している場合は、リモート インタフェースとそれを拡張するクラスで import 文を変えるだけで WebLogic RMI をインストールできます。クライアント アプリケーションにリモート呼び出しを追加するには、レジストリ内でオブジェクトを名前でルックアップします。

すべてのリモート オブジェクトの基本単位は java.rmi.Remote インタフェースで、これにはメソッドが含まれていません。この「タグ付け」インタフェースを拡張し(リモート クラスを識別するタグとして機能するように)、リモート オブジェクトの構造を作成するメソッドを使って、使用するリモート インタフェースを作成します。次に、リモート クラスを使ってリモート インタフェースを実装します。この実装はレジストリ内の名前にバインドされ、クライアントやサーバはそこからオブジェクトをルックアップしてリモートで使用できます。

JavaSoft の RMI の参照実装の場合と同様に、java.rmi.Naming クラスは重要なクラスです。このクラスには、レジストリ内のリモート オブジェクトに名前をバインド、アンバインド、リバインドするメソッドが含まれています。また、クライアントからレジストリ内の名前付きリモート オブジェクトにアクセスするための lookup() メソッドも含まれています。

さらに、 WebLogic JNDI はネーミング サービスとルックアップ サービスを提供します。WebLogic RMI は、JNDI によるネーミングとルックアップもサポートしています。

WebLogic RMI 例外は java.rmi 例外と同じ機能を備えているので、既存のインタフェースと実装で例外の処理方法を変える必要がありません。

 


WebLogic RMi の実装の手順

以下の節では WebLogic Server RMI の実装方法について説明します。

リモートで呼び出すことができるクラスを作成する

独自の WebLogic RMI クラスを簡単な手順で記述できます。次に、その単純な例を示します。

手順 1. リモート インタフェースを作成する

リモートで呼び出せるすべてのクラスは、リモート インタフェースを実装します。Java コードのテキスト エディタを使用し、以下のガイドラインに従ってリモート インタフェースを記述します。

JavaSoft のRMI では、リモート インタフェースを実装するすべてのクラスには、コンパイル済みのプロキシが存在しなければなりません。WebLogic RMI は、柔軟性の高い実行時のコード生成をサポートします。つまり、WebLogic RMI は、型さえ正しければ、そのほかはインタフェースを実装するクラスに依存しない動的プロキシと動的に生成されるバイトコードもサポートします。クラスが 1 つのリモート インタフェースを実装する場合、コンパイラが生成したプロキシとバイトコードは、リモート インタフェースと同じ名前になります。クラスが複数のリモート インタフェースを実装する場合、コード生成の結果できるプロキシとバイトコードの名前は、コンパイラが使う名前の区切り方によって変わります。

手順 2. リモート インタフェースを実装する

Java コードのテキスト エディタを使用して、リモートで呼び出されるクラスを記述します。このクラスは、手順 1 で記述したリモート インタフェースを実装する必要があります。これは、インタフェースに含まれるメソッド シグネチャを実装したことを意味します。現在のリリースでは、WebLogic RMI で行われるコード生成はこのクラスファイルに依存します。

WebLogic RMI では、クラスは JavaSoft RMI で必須の 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 のレジストリに登録します。リモートでオブジェクトを使用するためにプロキシを取得しようとするクライアントは、オブジェクトを名前でルックアップできます。

RMI レジストリによって除外される文字列名の構文は次のとおりです。

rmi://hostname:port/remoteObjectName

hostname(ホスト名)と port(ポート)は RMI レジストリが動作しているマシンとポートを識別し、remoteObjectName はリモート オブジェクトの文字列名です。ホスト名、ポート、およびプレフィックスの「rmi:」は省略可能です。ホスト名を指定しない場合、WebLogic Server はデフォルトでローカル ホストになります。ポートを指定しない場合、1099 番ポートが使用されます。remoteObjectName を指定しない場合、名前が付けられているオブジェクトは RMI レジストリ自体です。

詳細については、RMI 仕様を参照してください。

次に、HelloImpl クラス用の main() メソッドの例を示します。この例では、WebLogic Server レジストリに MultiHelloServer という名前で 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);

Naming.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 にインストールしないでください。

手順 3. Java クラスをコンパイルする

javac または他の Java コンパイラを使用して .java ファイルをコンパイルし、リモート インタフェースとそれを実装するクラス用の .class ファイルを作成します。

手順 4. 実装クラスを RMI コンパイラでコンパイルする

WebLogic RMI コンパイラ(weblogic.rmic)を実行するには、次のコマンド パターンを使用します。

$ java weblogic.rmic nameOfRemoteClass

nameOfRemoteClass は、リモート インタフェースを実装するクラスの完全なパッケージ名です。上で使用した例では、このコマンドは次のようになります。

$ java weblogic.rmic examples.rmi.hello.HelloImpl

生成したプロキシとバイトコードのソースを保持する場合は、WebLogic RMI コンパイラを実行するときに -keepgenerated フラグを設定します。使用可能な WebLogic RMI コンパイラ オプションの一覧については、 WebLogic RMI コンパイラのオプションを参照してください。

WebLogic RMI コンパイラを実行すると、プロキシとバイトコードが動的に生成されます。プロキシは、nameOfInterface_Proxy.class というクラスになります。作成される 3 つのファイル、つまりリモート インタフェース、リモート インタフェースを実装するクラス、およびプロキシは、WebLogic RMI コンパイラによって生成されるバイトコードとともに、オブジェクトの main() メソッドのネーミング方式で使用した URL を持つ WebLogic Server の CLASSPATH の該当ディレクトリに入れる必要があります。

手順 5. リモート メソッドを呼び出すコードを記述する

リモート クラス、リモート クラスが実装するインタフェース、およびそのプロキシとバイトコードをコンパイルして 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 アプリケーションを使用しています。

完全なコード例

次に、Hello インタフェースの完全なコードを示します。

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();

}

}

}

 

back to top previous page