| Oracle® Fusion Middleware Oracle WebLogic Server RMIアプリケーションの開発 12c (12.2.1) E70022-01 |
|
![]() 前 |
![]() 次 |
この章では、プレーンJavaオブジェクトへのリモート・アクセスを提供するWebLogic RMIアノテーションについて説明します。
WebLogic RMIは、各種セキュリティ、トランザクション、クラスタリングおよびタイムアウト属性をリモート・クラスやそのメソッドに関連付けるリッチ記述子フレームワークを備えています。これらの属性は、リモート・オブジェクト実装がWebLogic JNDIツリーにバインドされる場合、リモート以外のインタフェースを含むプレーンJava実装クラスでアノテーションとして指定できます。Oracle WebLogic Server Java APIリファレンスのweblogic.rmi.annotationに関する項を参照してください。
この章には次の項が含まれます:
WebLogic RMIでは、リモートJavaオブジェクト内に組込み可能なアノテーションのサポートが提供され、コンパイル済クラスでのweblogic.rmicツールの実行を回避できることで、開発が簡素化されます。
プレーンJavaオブジェクトにリモートでアクセスできるようにするには、次の操作を実行します。
クライアントでアクセスするインタフェースを作成します。このインタフェースはjava.rmi.Remoteを拡張する必要があります。例4-1を参照してください。
手順1のインタフェースを実装する実装クラスを作成します。
目的のアノテーション@Rmiまたは@RmiMethodを、手順2で追加された実装クラスに追加します。アノテーションはインタフェースではなく、実装クラスやメソッドに指定する必要があります。
アプリケーションのクラスをコンパイルしてバンドルします。
アプリケーションをデプロイします。
WebLogic JNDIツリーで、アノテーション付きプレーンJavaオブジェクトをバインドします。
クライアントは、WebLogic JNDIツリーのリモート・オブジェクトとしてプレーンJavaオブジェクトをルックアップし、それをリモート・インタフェースとしてアノテーションが付けられたプレーン・インタフェースに絞り込みます。対応するスタブは、クライアントで生成されるか、ダウンロードされるか、WebLogic RMIコンパイラを使用して事前生成されるかのいずれかになり、クライアントで利用可能になります。
|
注意: Sun RMIコンパイラに基づいてスタブやスケルトンを生成する場合、WebLogic RMICオプションは使用しないでください。 |
例4-1 RMIアノテーションの例
package myrmi.example;
import java.rmi.RemoteException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import weblogic.rmi.annotation.Rmi;
import weblogic.rmi.annotation.RmiMethod;
@Rmi(remoteInterfaces={MyRemoteInterface.class})
public class RmiMethodAnnotations implements MyRemoteInterface{
public RmiMethodAnnotations() {
}
public int getIndex() throws RemoteException {
return 0;
}
@RmiMethod(asynchronousResult=true)
public Future<String> ejbAsynchronousSayHello(String name) {
return new FutureTask(new MyRunnable(), new Object());
}
class MyRunnable implements Runnable {
public void run() {
}
}
}
これにより、WebLogic RMIレイヤーは、RmiMethodAnnotationsオブジェクトがWLS JNDIツリーにバインドされる場合、それをリモート・オブジェクトとして扱うことができます。
例4-2に、アノテーションを使用せずに同じメソッドを実装するコード例を示します。
例4-2 アノテーションを使用しないRMIの例
package myrmi.example;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.concurrent.Future;
public interface MyRemoteInterface extends Remote {
int getIndex() throws RemoteException;
public Future<String> ejbAsynchronousSayHello(String name);
public String sayBye();
}
次のトピックでは、WebLogic RMIアノテーションに関するリファレンス情報を提供します。
以降の節では、このアノテーションについて詳しく説明します。
次の表で属性について簡単に説明します。
表4-1 Rmiアノテーションの属性
| 名前 | 説明 | データ型 | デフォルト値 |
|---|---|---|---|
|
|
コールのパラメータで各呼出し前にコールされる |
|
"" |
|
|
リモート・オブジェクトがクラスタ可能かどうかを示します。 |
|
|
|
|
デフォルトのRMIメソッドのアノテーション。メソッド・アノテーションでオーバーライドできます。 |
|
|
|
|
クラスタ化されるリモート・オブジェクトのロード・アルゴリズム。有効値は、次のとおりです。
デフォルトは |
|
|
|
|
スティッキーなロード・バランシングを有効にします。最初のリクエストをサービスするために選ばれたサーバーが、後続のすべてのリクエストにも使用されます。クラスタ可能なリモート・オブジェクトにのみ使用されます。 |
|
|
|
|
リモート・インタフェースとして扱われるインタフェース・クラス名のカンマ区切りリスト。 |
|
"" |
以降の節では、このアノテーションについて詳しく説明します。
リモート実装クラスを指定するリモート・オブジェクトにメソッドレベルのアノテーション・サポートを提供します。
「weblogic.rmi.annotation.RmiMethod」を参照してください。
次の表で属性について簡単に説明します。
表4-2 RmiMethodアノテーションの属性
| 名前 | 説明 | データ型 | デフォルト値 |
|---|---|---|---|
|
|
|
|
|
|
|
リモート・オブジェクト・リクエストのスケジュールに使用されるワーク・マネージャを指定します。 |
|
"" |
|
|
多重呼出し不変メソッドを指定します。 |
|
|
|
|
一方向のコールを指定します。 |
|
|
|
|
リモート・コールのタイムアウトを指定します。 |
|
0 |
|
|
トランザクション・メソッドを指定します。指定しない場合、RMIコールを行う前にトランザクションを中断し、コールが完了した後にトランザクションを再開します。 |
|
|
次の項では、WebLogic RMIアノテーションの例外処理について説明します。
クライアントは、確認されたすべてのアプリケーション例外を受信します。
クライアントは、リモート・メソッドの呼出し時に発生したすべてのエラーとランタイム例外を受信します。
リモート例外は次のように処理されます。
確認された例外は、クライアントに直接スローされます。
未確認の例外はRuntimeExceptionにラップされてから、クライアントにスローされます。
生成されたEJB 3.0オブジェクトは、すべてのEJBメソッドのEJBExceptionになるようにremoteExceptionWrapperにアノテーションを付けます。クライアントは、EJBExceptionにラップされたすべてのリモート例外を受信します。
remoteExceptionWrapperアノテーションは、実装クラス全体に対して、または指定したランタイム例外にすべてのリモート例外をラップする特定のメソッドに対して指定してから、クライアントに戻すことができます。remoteExceptionWrapperアノテーションを指定しない場合、リモート例外は、表4-3に示すようにラップされます。
表4-3 WebLogicクライアントでの例外のラップ
| クライアント | 例外のラップ |
|---|---|
|
WLフル・クライアント |
|
|
WLシンT3クライアント |
|
|
WLS-IIOPクライアント脚注3 |
または
|
|
シン・クライアント |
または
|
|
Java SEクライアント |
または
|
脚注1weblogic.rmi.extensions.RemoteRuntimeExceptionは、RuntimeExceptionのサブクラスです。
脚注2weblogic.rmi.extensions.RemoteRuntimeExceptionは、RuntimeExceptionのサブクラスです。
脚注3既存のT3プロトコル・レイヤーは、常にRemoteExceptionをjava.rmi.ServerExceptionとしてラップしませんが、IIOPプロトコルはサーバーで常にこれをラップします。
クラスタ化されたスタブは、受信した例外のタイプに基づき、クラスタの別のノードへのリモート・コールのフェイルオーバーを自動で処理します。スタブのRuntimeExceptionのようなリモート例外をラップしても、リモート・オブジェクトのフェイルオーバー動作は変わりません。
アノテーション付きリモート・オブジェクトを含むコールバック・オブジェクトを渡すには、extend java.rmi.Remoteインタフェースへのコールバック・リモート・オブジェクトが必要です。
|
注意: 一部のクライアント・タイプでは、WebLogicクラスにアクセスできないため、コールバック・オブジェクトをサポートできません。たとえば、Java SEクライアントなどがあります。 |
実装クラスで指定されたアノテーションは、サーバーでオーバーライドできません。アプリケーション記述子とデプロイメント・プランをマージして、記述子の値の正しいセットが使用されるようにする必要があります。