WebLogic RMIは、各種セキュリティ、トランザクション、クラスタリングおよびタイムアウト属性をリモート・クラスやそのメソッドに関連付けるリッチ記述子フレームワークを備えています。これらの属性は、リモート・オブジェクト実装がWebLogic JNDIツリーにバインドされる場合、リモート以外のインタフェースを含むプレーンJava実装クラスでアノテーションとして指定できます。Oracle WebLogic Server Java APIリファレンスのweblogic.rmi.annotationを参照してください。
この章には次の項が含まれます:
WebLogic RMIでは、リモートJavaオブジェクト内に組込み可能なアノテーションのサポートが提供され、コンパイル済クラスでのweblogic.rmic
ツールの実行を回避できることで、開発が簡素化されます。
プレーンJavaオブジェクトにリモートでアクセスできるようにするには、次の操作を実行します。
例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() { } } }
例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レイヤーは、RmiMethodAnnotations
オブジェクトがWLS JNDIツリーにバインドされる場合、それをリモート・オブジェクトとして扱うことができます。
例4-2に、アノテーションを使用せずに同じメソッドを実装するコード例を示します。
以降の節では、このアノテーションについて詳しく説明します。
次の表で属性について簡単に説明します。
表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クライアント |
または
|
脚注 1
weblogic.rmi.extensions.RemoteRuntimeException
は、RuntimeException
のサブクラスです。
脚注 2
weblogic.rmi.extensions.RemoteRuntimeException
は、RuntimeException
のサブクラスです。
脚注 3
既存のT3プロトコル・レイヤーは、常にRemoteException
をjava.rmi.ServerException
としてラップしませんが、IIOPプロトコルはサーバーで常にこれをラップします。
クラスタ化されたスタブは、受信した例外のタイプに基づき、クラスタの別のノードへのリモート・コールのフェイルオーバーを自動で処理します。スタブのRuntimeException
のようなリモート例外をラップしても、リモート・オブジェクトのフェイルオーバー動作は変わりません。
アノテーション付きリモート・オブジェクトを含むコールバック・オブジェクトを渡すには、extend java.rmi.Remote
インタフェースへのコールバック・リモート・オブジェクトが必要です。
注意:
一部のクライアント・タイプでは、WebLogicクラスにアクセスできないため、コールバック・オブジェクトをサポートできません。たとえば、Java SEクライアントなどがあります。