プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server RMIアプリケーションの開発
12c (12.2.1)
E70022-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

4 WebLogic RMIアノテーションの使用

この章では、プレーンJavaオブジェクトへのリモート・アクセスを提供するWebLogic RMIアノテーションについて説明します。

WebLogic RMIは、各種セキュリティ、トランザクション、クラスタリングおよびタイムアウト属性をリモート・クラスやそのメソッドに関連付けるリッチ記述子フレームワークを備えています。これらの属性は、リモート・オブジェクト実装がWebLogic JNDIツリーにバインドされる場合、リモート以外のインタフェースを含むプレーンJava実装クラスでアノテーションとして指定できます。Oracle WebLogic Server Java APIリファレンスweblogic.rmi.annotationに関する項を参照してください。

この章には次の項が含まれます:

WebLogic RMIアノテーションの概要

WebLogic RMIでは、リモートJavaオブジェクト内に組込み可能なアノテーションのサポートが提供され、コンパイル済クラスでのweblogic.rmicツールの実行を回避できることで、開発が簡素化されます。

プレーンJavaオブジェクトにリモートでアクセスできるようにするには、次の操作を実行します。

  1. クライアントでアクセスするインタフェースを作成します。このインタフェースはjava.rmi.Remoteを拡張する必要があります。例4-1を参照してください。

  2. 手順1のインタフェースを実装する実装クラスを作成します。

  3. 目的のアノテーション@Rmiまたは@RmiMethodを、手順2で追加された実装クラスに追加します。アノテーションはインタフェースではなく、実装クラスやメソッドに指定する必要があります。

  4. アプリケーションのクラスをコンパイルしてバンドルします。

  5. アプリケーションをデプロイします。

  6. WebLogic JNDIツリーで、アノテーション付きプレーンJavaオブジェクトをバインドします。

  7. クライアントは、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のアノテーション

次のトピックでは、WebLogic RMIアノテーションに関するリファレンス情報を提供します。

Rmi

以降の節では、このアノテーションについて詳しく説明します。

説明

リモート実装クラスを指定するリモート・オブジェクトにクラスレベルのアノテーション・サポートを提供します。

「weblogic.rmi.annotation.Rmi」を参照してください。

属性

次の表で属性について簡単に説明します。

表4-1 Rmiアノテーションの属性

名前 説明 データ型 デフォルト値

callRouterClassname

コールのパラメータで各呼出し前にコールされるCallRouterクラス。コールのルーティング先のネーム・サーバーを返します。パラメータベースのルーティングにより、詳細なロード・バランシング動作を指定できます。

String

""

clusterable

リモート・オブジェクトがクラスタ可能かどうかを示します。

boolean

false

defaultRMIMethodParams

デフォルトのRMIメソッドのアノテーション。メソッド・アノテーションでオーバーライドできます。

RmiMethod

@weblogic.rmi.annotation.RmiMethod

loadAlgorithm

クラスタ化されるリモート・オブジェクトのロード・アルゴリズム。有効値は、次のとおりです。

  • RANDOM

  • ROUND_ROBIN

  • WEIGHT_BASED

  • SERVER_AFFINITY

  • ROUND_ROBIN_AFFINITY

  • RANDOM_AFFINITY

  • WEIGHT_BASED_AFFINITY

  • DEFAULT

デフォルトはROUND_ROBINです。

LoadAlgorithmType

weblogic.rmi.annotation.LoadAlgorithmType.DEFAULT

stickToFirstServer

スティッキーなロード・バランシングを有効にします。最初のリクエストをサービスするために選ばれたサーバーが、後続のすべてのリクエストにも使用されます。クラスタ可能なリモート・オブジェクトにのみ使用されます。

boolean

false

remoteInterfaces

リモート・インタフェースとして扱われるインタフェース・クラス名のカンマ区切りリスト。

Class

""


RmiMethod

以降の節では、このアノテーションについて詳しく説明します。

説明

リモート実装クラスを指定するリモート・オブジェクトにメソッドレベルのアノテーション・サポートを提供します。

「weblogic.rmi.annotation.RmiMethod」を参照してください。

属性

次の表で属性について簡単に説明します。

表4-2 RmiMethodアノテーションの属性

名前 説明 データ型 デフォルト値

asynchronousResult

trueの場合、非同期処理するメソッドをマークします。通常、メソッドを呼び出す場合、メソッド実行が完了するとすぐに結果が返されます。asynchronousResult=trueの場合、メソッドの戻りタイプはvoidまたはFutureオブジェクトのいずれかになります。タイプがFutureオブジェクトの場合、それをポーリングして、結果が利用可能かどうかを確認できます。タイプがvoidの場合、メソッドは非同期の一方向コールとして扱われます。

boolean

false

dispatchPolicy

リモート・オブジェクト・リクエストのスケジュールに使用されるワーク・マネージャを指定します。

String

""

idempotent

多重呼出し不変メソッドを指定します。

boolean

false

oneway

一方向のコールを指定します。

boolean

false

timeout

リモート・コールのタイムアウトを指定します。

int

0

transactional

トランザクション・メソッドを指定します。指定しない場合、RMIコールを行う前にトランザクションを中断し、コールが完了した後にトランザクションを再開します。

boolean

false


例外処理

次の項では、WebLogic RMIアノテーションの例外処理について説明します。

アプリケーションの例外

クライアントは、確認されたすべてのアプリケーション例外を受信します。

システム例外

クライアントは、リモート・メソッドの呼出し時に発生したすべてのエラーとランタイム例外を受信します。

リモート例外は次のように処理されます。

  • 確認された例外は、クライアントに直接スローされます。

  • 未確認の例外はRuntimeExceptionにラップされてから、クライアントにスローされます。

  • 生成されたEJB 3.0オブジェクトは、すべてのEJBメソッドのEJBExceptionになるようにremoteExceptionWrapperにアノテーションを付けます。クライアントは、EJBExceptionにラップされたすべてのリモート例外を受信します。

remoteExceptionWrapperアノテーションは、実装クラス全体に対して、または指定したランタイム例外にすべてのリモート例外をラップする特定のメソッドに対して指定してから、クライアントに戻すことができます。remoteExceptionWrapperアノテーションを指定しない場合、リモート例外は、表4-3に示すようにラップされます。

表4-3 WebLogicクライアントでの例外のラップ

クライアント 例外のラップ

WLフル・クライアント

RemoteRuntimeException脚注1は、RemoteExceptionをラップします。

WLシンT3クライアント

RemoteRuntimeException脚注2は、RemoteExceptionをラップします。

WLS-IIOPクライアント脚注3

RemoteRuntimeExceptionは、RemoteExceptionをラップするjava.rmi.ServerExceptionをラップします。

または

RemoteRuntimeExceptionはRemoteExceptionをラップします

シン・クライアント

java.lang.RuntimeExceptionは、RemoteExceptionをラップするServerExceptionをラップします。

または

RuntimeExceptionRemoteExceptionをラップします

Java SEクライアント

java.lang.RuntimeExceptionは、RemoteExceptionをラップするServerExceptionをラップします。

または

RuntimeExceptionRemoteExceptionをラップします


脚注1weblogic.rmi.extensions.RemoteRuntimeExceptionは、RuntimeExceptionのサブクラスです。

脚注2weblogic.rmi.extensions.RemoteRuntimeExceptionは、RuntimeExceptionのサブクラスです。

脚注3既存のT3プロトコル・レイヤーは、常にRemoteExceptionjava.rmi.ServerExceptionとしてラップしませんが、IIOPプロトコルはサーバーで常にこれをラップします。

クラスタ・フェイルオーバー

クラスタ化されたスタブは、受信した例外のタイプに基づき、クラスタの別のノードへのリモート・コールのフェイルオーバーを自動で処理します。スタブのRuntimeExceptionのようなリモート例外をラップしても、リモート・オブジェクトのフェイルオーバー動作は変わりません。

RMIコールバック・オブジェクト

アノテーション付きリモート・オブジェクトを含むコールバック・オブジェクトを渡すには、extend java.rmi.Remoteインタフェースへのコールバック・リモート・オブジェクトが必要です。


注意:

一部のクライアント・タイプでは、WebLogicクラスにアクセスできないため、コールバック・オブジェクトをサポートできません。たとえば、Java SEクライアントなどがあります。

アノテーションとWebLogic RMI記述子のマージ

実装クラスで指定されたアノテーションは、サーバーでオーバーライドできません。アプリケーション記述子とデプロイメント・プランをマージして、記述子の値の正しいセットが使用されるようにする必要があります。