ヘッダーをスキップ

Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド
10g(10.1.3.1.0)

B31852-03
目次
目次
索引
索引

戻る 次へ

10 EJB 3.0メッセージドリブンBeanの使用方法

この章では、EJB 3.0メッセージドリブンBeanを使用するために構成する必要のある様々なオプションについて説明します。

表10-1に、これらのオプションをリストし、基本オプション(ほとんどのアプリケーションに適用可能)であるか拡張オプション(より特殊なアプリケーションに適用可能)であるかを示します。

詳細は、次を参照してください。

J2CAを使用してメッセージ・サービス・プロバイダにアクセスするためのEJB 3.0 MDBの構成

Oracle JMSコネクタなどのJ2CAリソース・アダプタを使用してメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成できます。

これを行うには、アノテーション(「アノテーションの使用方法」を参照)またはデプロイXML(「デプロイXMLの使用方法」を参照)を使用します。


注意

メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどのJ2CAリソース・アダプタを使用してアクセスすることをお薦めします。詳細は、「J2CAリソース・アダプタを使用せずにメッセージ・サービス・プロバイダにアクセスする場合の制限」を参照してください。 


OC4Jでは、2フェーズ・コミット(2PC)トランザクション用のXAファクトリと、2PCを必要としないトランザクション用の非XAファクトリの両方がサポートされます。

詳細は、次を参照してください。

アノテーションの使用方法

J2CAリソース・アダプタを使用してJMSメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成するには、次のようにします。

  1. リソース・アダプタの名前を指定します。

    OC4J固有の@MessageDrivenDeploymentアノテーションのresourceAdapter属性(例10-1を参照)、またはそれと同等のorion-ejb-jar.xmlファイルの<message-driven-deployment>要素のresource-adapter属性(「デプロイXMLの使用方法」を参照)を使用できます。

  2. 必要なアクティブ化構成プロパティを指定します。

    アクティブ化構成プロパティは、@MessageDrivenDeploymentおよび@MessageDrivenアノテーション(例10-1を参照)とデプロイXML(「デプロイXMLの使用方法」を参照)の任意の組合せを使用して指定できます。

    詳細は、次を参照してください。

例10-1に、OracleASjmsという名前のOracle JMSリソース・アダプタを使用するようにメッセージドリブンBeanを構成する方法を示します。メッセージ・サービス・プロバイダの構成時に、コネクション・ファクトリOracleASjms/MyQCFoc4j-ra.xmlファイルに定義し、接続先名OracleASjms/MyQueueoc4j-connectors.xmlファイルに定義してあることを前提とします。2フェーズ・コミット(2PC)をサポートするXA対応ファクトリを定義するか、または2PCサポートが必要でない場合は非XAファクトリを定義します。J2CAメッセージ・サービス・プロバイダの構成の詳細は、「メッセージ・サービス・プロバイダで使用するためのJ2CAリソース・アダプタの構成」を参照してください。

例10-1    J2CAのメッセージ・サービス・プロバイダの@MessageDrivenおよび@MessageDrivenDeploymentアノテーション

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.ejb.ActivationConfigProperty;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
            propertyName="ConnectionFactoryJndiName", propertyValue="OracleASjms/MyQCF"),
        @ActivationConfigProperty(
            propertyName="DestinationName", propertyValue="OracleASjms/MyQueue"),
        @ActivationConfigProperty(
            propertyName="DestinationType", propertyValue="javax.jms.Queue"),
        @ActivationConfigProperty(
            propertyName="messageSelector", propertyValue="RECIPIENT = 'simple_jca_test'")
    })

// associate MDB with the resource adapter
@MessageDrivenDeployment(resourceAdapter = "OracleASjms")

public class JCAQueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

使用する実際の名前は、メッセージ・サービス・プロバイダのインストール環境によって決まります。
詳細は、「J2CAメッセージ・サービス・プロバイダのコネクション・ファクトリ名」を参照してください。

デプロイXMLの使用方法

J2CAリソース・アダプタを使用してJMSメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成するには、EJB 2.1 MDBの場合と同様に(「デプロイXMLの使用方法」を参照)、ejb-jar.xmlorion-ejb.jar.xmlという2つのデプロイXMLファイルを使用する必要があります。

アノテーション構成が存在する場合(「アノテーションの使用方法」を参照)、このデプロイXML構成でオーバーライドできます。

直接メッセージ・サービス・プロバイダにアクセスするためのEJB 3.0 MDBの構成

(J2CAリソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成できます。

これを行うには、アノテーション(「アノテーションの使用方法」を参照)またはデプロイXML(「デプロイXMLの使用方法」を参照)を使用します。


注意

メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどのJ2CAリソース・アダプタを使用してアクセスすることをお薦めします。詳細は、次を参照してください。

 

OC4Jでは、2フェーズ・コミット(2PC)トランザクション用のXAファクトリと、2PCを必要としないトランザクション用の非XAファクトリの両方がサポートされます。

詳細は、次を参照してください。

アノテーションの使用方法

J2CAリソース・アダプタを使用せずにJMSメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成するには、次のようにします。

  1. 必要なアクティブ化構成プロパティを指定します。

    アクティブ化構成プロパティは、@MessageDrivenDeploymentアノテーション、@MessageDrivenアノテーションおよびデプロイXMLの任意の組合せを使用して指定できます。

    詳細は、次を参照してください。

例10-2に、(J2CAリソース・アダプタを使用せずに)直接JMSメッセージ・サービス・プロバイダにアクセスするようメッセージドリブンBeanを構成する方法を示します。メッセージ・サービス・プロバイダの構成時に、コネクション・ファクトリjms/MyQCFおよびキューjms/MyQueueを定義してあることを前提とします。2フェーズ・コミット(2PC)をサポートするXA対応ファクトリを定義するか、または2PCサポートが必要でない場合は非XAファクトリを定義します。メッセージ・サービス・プロバイダの構成の詳細は、第23章「メッセージ・サービスの構成」を参照してください。

例10-2    J2CA以外のメッセージ・サービス・プロバイダの@MessageDrivenアノテーション

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.jms.MessageListener;

@MessageDriven(
    messageListenerInterface=MessageListener.class,
    activationConfig = {
        @ActivationConfigProperty(
            propertyName="connectionFactoryJndiName", propertyValue="jms/MyQCF"),
        @ActivationConfigProperty(
            propertyName="destinationName", propertyValue="jms/MyQueue"),
        @ActivationConfigProperty(
            propertyName="destinationType", propertyValue="javax.jms.Queue"),
        @ActivationConfigProperty(
            propertyName="messageSelector", propertyValue="RECIPIENT = 'simple_test'")
    })

public class QueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

使用する実際の名前は、メッセージ・サービス・プロバイダのインストール環境によって決まります。詳細は、次を参照してください。

デプロイXMLの使用方法

(J2CAリソース・アダプタを使用せずに)直接JMSメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成するには、EJB 2.1 MDBの場合と同様に(「デプロイXMLの使用方法」を参照)、ejb-jar.xmlorion-ejb.jar.xmlという2つのデプロイXMLファイルを使用する必要があります。

アノテーション構成が存在する場合(「アノテーションの使用方法」を参照)、このデプロイXML構成でオーバーライドできます。

パラレル・メッセージ処理の構成

デフォルトでは、OC4Jはメッセージ・ロケーションのメッセージをポーリングするために1つの受信スレッドを使用します。

2つ以上の受信スレッドを使用すると、メッセージをパラレルに受信できるため、パフォーマンスが向上する可能性があります。

メッセージ・ロケーションがトピックの場合、受信スレッドの数は1に固定されます。

メッセージ・ロケーションがキューの場合、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)を使用して受信スレッドの数を構成できます。

MDBプールのBeanインスタンスの最小数は、受信スレッドがメッセージ処理のためにプールからBeanインスタンスを取得できるように、少なくとも受信スレッドの数と同じに設定する必要があります。

詳細は、次を参照してください。

アノテーションの使用方法

このオプションの構成方法は、使用するメッセージ・サービス・プロバイダへのアクセス方法によって決まります。

J2CAリソース・アダプタを使用したメッセージ・サービス・プロバイダへのアクセス

J2CAリソース・アダプタを使用してメッセージ・サービス・プロバイダにアクセスする場合、例10-3に示すようにアクティブ化構成プロパティReceiverThreadsを設定します。

ReceiverThreadsの詳細は、表B-2を参照してください。

例10-3    J2CAアダプタを使用したメッセージ・サービス・プロバイダのためのパラレル・メッセージ処理の構成

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.ejb.ActivationConfigProperty;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(propertyName="ReceiverThreads", propertyValue="3"),
        ...
    }
)

@MessageDrivenDeployment(
    resourceAdapter = "OracleASjms",
    ...
)

public class JCAQueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

J2CAリソース・アダプタを使用しないメッセージ・サービス・プロバイダへのアクセス

(J2CAリソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスする場合、例10-4に示すようにOC4J固有のアノテーション@MessageDrivenDeploymentの属性listenerThreadsを設定します。

この@MessageDrivenDeploymentの属性の詳細は、表A-3を参照してください。@MessageDrivenDeploymentアノテーションの詳細は、「EJB 3.0 MDBのOC4J固有のデプロイ・オプションの構成」を参照してください。


注意

メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどのJ2CAリソース・アダプタを使用してアクセスすることをお薦めします。詳細は、次を参照してください。

 

例10-4    J2CAアダプタを使用しないメッセージ・サービス・プロバイダのためのパラレル・
メッセージ処理の構成

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(
    ...
)

@MessageDrivenDeployment(
    listenerThreads=3
)

public class QueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

デプロイXMLの使用方法

EJB 3.0メッセージドリブンBeanでは、EJB 2.1メッセージドリブンBeanと同様に、orion-ejb-jar.xmlファイルでパラレル・メッセージ処理を構成します(「デプロイXMLの使用方法」を参照)。

最大配信数の構成

メッセージドリブンBeanのメッセージ・リスナー・メソッド(JMSメッセージ・リスナーのonMessageメソッドなど)がエラーを返した場合(確認応答操作の起動に失敗した場合、または例外をスローした場合、あるいはその両方の場合)に、OC4Jがそのメソッドにメッセージの即時再配信を試行する最大回数を構成できます。

この回数の再配信が行われた後で、メッセージは配信不能とみなされ、メッセージ・サービス・プロバイダのポリシーに従って処理されます。たとえば、OEMS JMSはその例外キュー(jms/Oc4jJmsExceptionQueue)にメッセージを挿入します。

最大配信数は、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)を使用して構成できます。

詳細は、「メッセージ・サービス構成オプション: アノテーションまたはXMLの選択と属性またはアクティブ化構成プロパティの選択」を参照してください。

アノテーションの使用方法

このオプションの構成方法は、使用するメッセージ・サービス・プロバイダのタイプによって決まります。

J2CAリソース・アダプタを使用したメッセージ・サービス・プロバイダへのアクセス

J2CAリソース・アダプタを使用してメッセージ・サービス・プロバイダにアクセスする場合、例10-5に示すようにアクティブ化構成プロパティMaxDeliveryCntを設定します。

MaxDeliveryCntの詳細は、表B-2を参照してください。

例10-5    J2CAアダプタを使用したメッセージ・サービス・プロバイダのための最大配信数の構成

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.ejb.ActivationConfigProperty;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(propertyName="MaxDeliveryCnt", propertyValue="3"),
        ...
    }
)

@MessageDrivenDeployment(
    resourceAdapter = "OracleASjms",
    ...
)

public class JCAQueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

J2CAリソース・アダプタを使用しないメッセージ・サービス・プロバイダへのアクセス

(J2CAリソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスする場合、例10-6に示すようにOC4J固有のアノテーション@MessageDrivenDeploymentの属性maxDeliveryCountを設定します。

この@MessageDrivenDeploymentの属性の詳細は、表A-3を参照してください。@MessageDrivenDeploymentアノテーションの詳細は、「EJB 3.0 MDBのOC4J固有のデプロイ・オプションの構成」を参照してください。


注意

メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどのJ2CAリソース・アダプタを使用してアクセスすることをお薦めします。詳細は、次を参照してください。

 

例10-6    J2CAアダプタを使用しないメッセージ・サービス・プロバイダのための最大配信数の構成

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(
    ...
)

@MessageDrivenDeployment(
    maxDeliveryCount=3
)

public class QueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

デプロイXMLの使用方法

EJB 3.0メッセージドリブンBeanでは、EJB 2.1メッセージドリブンBeanと同様に、orion-ejb-jar.xmlファイルで最大配信数を構成します(「デプロイXMLの使用方法」を参照)。

EJB 3.0 MDBの接続障害リカバリの構成

ネットワークやJMSサーバーの停止などのイベントを原因とする接続障害に対し、メッセージドリブンBeanのリスナー・スレッドでどのように応答するかを構成できます。

これらのオプションは、メッセージドリブンBeanのコンテナ管理のトランザクションにのみ適用されます。

接続障害リカバリ・オプションは、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)を使用して構成できます。

詳細は、次を参照してください。

アノテーションの使用方法

このオプションの構成方法は、使用するメッセージ・サービス・プロバイダのタイプによって決まります。

J2CAリソース・アダプタを使用したメッセージ・サービス・プロバイダへのアクセス

J2CAリソース・アダプタを使用してメッセージ・サービス・プロバイダにアクセスする場合、Oracle JMSコネクタは、JMSリソースのポーリングを無制限に再試行します。この再試行間隔は、例10-7に示すようにアクティブ化構成プロパティEndpointFailureRetryIntervalで構成できます。

再試行後のメッセージのリカバリでは、メッセージの順序は保証されません。また、JMSトピックに対するMDBサブスクリプションが非永続的な場合、メッセージは失われるか、重複する可能性があります。

詳細は、表B-2EndpointFailureRetryIntervalを参照してください。

例10-7    J2CAアダプタを使用したメッセージ・サービス・プロバイダのための接続障害リカバリの構成

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.ejb.ActivationConfigProperty;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
            propertyName="EndpointFailureRetryInterval",
            propertyValue="20000"
        ),
        ...
    }
)

@MessageDrivenDeployment(
    resourceAdapter = "OracleASjms",
    ...
)

public class JCAQueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

J2CAリソース・アダプタを使用しないメッセージ・サービス・プロバイダへのアクセス

(J2CAリソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスする場合、例10-8に示すようにOC4J固有のアノテーション@MessageDrivenDeploymentの属性dequeueRetryCountおよびdequeueRetryIntervalを設定します。

この@MessageDrivenDeploymentの属性の詳細は、表A-3を参照してください。@MessageDrivenDeploymentアノテーションの詳細は、「EJB 3.0 MDBのOC4J固有のデプロイ・オプションの構成」を参照してください。


注意

メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどのJ2CAリソース・アダプタを使用してアクセスすることをお薦めします。詳細は、次を参照してください。

 

例10-8    J2CAアダプタを使用しないメッセージ・サービス・プロバイダのための接続障害リカバリの構成

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(
        ...
)

@MessageDrivenDeployment(
    dequeueRetryCount=3,
    dequeueRetryInterval=90
)

public class QueueMDB implements MessageListener {
    public void onMessage(Message msg) {
        ...
    }
}

 

デプロイXMLの使用方法

EJB 3.0メッセージドリブンBeanでは、EJB 2.1メッセージドリブンBeanと同様に、orion-ejb-jar.xmlファイルでデキュー再試行を構成します(「デプロイXMLの使用方法」を参照)。

EJB 3.0 MDBのライフ・サイクル・コールバック・インターセプタ・メソッドの構成

EJB 3.0メッセージドリブンBeanクラス・メソッドを次のライフ・サイクル・イベントのコールバック・メソッドとして指定できます(「アノテーションの使用方法」を参照)。

メッセージドリブンBeanクラスのライフ・サイクル・コールバック・メソッドは、次のシグネチャを持つ必要があります。

void <METHOD>()

EJB 3.0メッセージドリブンBeanに関連付けるインターセプタ・クラスで1つ以上のライフ・サイクル・コールバック・メソッドを指定することもできます(「EJB 3.0 MDBのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)。

詳細は、次を参照してください。

アノテーションの使用方法

次のいずれかのアノテーションを使用して、EJB 3.0メッセージドリブンBeanクラス・メソッドをライフ・サイクル・コールバック・メソッドとして指定できます。

例10-9に、@PostConstructアノテーションを使用してEJB 3.0メッセージドリブンBeanのクラス・メソッドinitializeをライフ・サイクル・コールバック・メソッドとして指定する方法を示します。

例10-9    EJB 3.0メッセージドリブンBeanの@PostConstruct

@MessageDriven
public class MessageLogger implements MessageListener {
    @Resource javax.ejb.MessageDrivenContext mc;

    public void onMessage(Message message) {
    ....
    }

    @PostConstruct
    public void initialize() {
        // Initialization logic
    }
...
}

 

EJB 3.0 MDBのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成

EJB 3.0メッセージドリブンBeanのインターセプタ・クラスのインターセプタ・メソッドをライフ・サイクル・コールバック・インターセプタ・メソッドとして指定できます。

インターセプタ・クラスでライフ・サイクル・コールバック・インターセプタ・メソッドを構成するには、次のようにします。

  1. インターセプタ・クラスを作成します。

    これは、任意のPOJOクラスにすることができます。

    インターセプタ・クラスは、引数のないpublicコンストラクタを保持する必要があります。

  2. ライフ・サイクル・コールバック・インターセプタ・メソッドを実装します。

    Beanのインターセプタ・クラスに定義するコールバック・メソッドには、次のシグネチャを割り当てます。

    Object <METHOD>(InvocationContext)
    
    
  3. ライフ・サイクル・イベントをコールバック・インターセプタ・メソッドに関連付けます。

    1つのライフ・サイクル・イベントは、1つのコールバック・インターセプタ・メソッドにのみ関連付けることができますが、1つのライフ・サイクル・コールバック・インターセプタ・メソッドは、複数のコールバック・イベントに割り込むために使用できます。たとえば、@PostConstruct@PreDestroyは、インターセプタ・クラス内で1回のみ出現可能ですが、@PostConstruct@PreDestroyの両方を同じコールバック・インターセプタ・メソッドに関連付けることができます。

    詳細は、次を参照してください。

  4. インターセプタ・クラスをEJB 3.0メッセージドリブンBeanに関連付けます(「EJB 3.0 MDBのインターセプタ・クラスの構成」を参照)。

詳細は、次を参照してください。

アノテーションの使用方法

次のいずれかのアノテーションを使用して、インターセプタ・クラス・メソッドをEJB 3.0メッセージドリブンBeanのライフ・サイクル・コールバック・メソッドとして指定できます。

例10-10に、@PostConstructおよび@PreDestroyアノテーションを使用して、myPostConstructMethodおよびmyPreDestroyMethodをライフ・サイクル・コールバック・インターセプタ・メソッドとして指定する方法を示します。OC4Jは、適切なライフ・サイクル・イベントが発生した場合にのみ、対応するライフ・サイクル・メソッドを起動します。OC4Jは、メッセージドリブンBeanのビジネス・メソッドが起動されるたびに、ライフ・サイクル・インターセプタ・メソッド以外のすべてのインターセプタ・メソッド(myInterceptorMethodなど)を起動します(「EJB 3.0 MDBのインターセプタ・クラスの構成」を参照)。

例10-10    インターセプタ・クラス

public class MyInterceptor {
    ...
    public void myInterceptorMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }

    @PostConstruct
    public void myPostContructMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }

    @PreDestroy
    public void myPreDestroyMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }
}

 

EJB 3.0 MDBのAroundInvokeインターセプタ・メソッドの構成

1つの非ビジネス・メソッドをEJB 3.0メッセージドリブンBeanのインターセプタ・メソッドとして指定できます。onMessageメソッドが起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドを起動します。onMessageメソッド起動は、インターセプタ・メソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

インターセプタ・メソッドには次のシグネチャがあります。

Object <METHOD>(InvocationContext) throws Exception

インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。

このメソッドは、EJB 3.0メッセージドリブンBeanクラスに指定するか(「アノテーションの使用方法」を参照)、EJB 3.0メッセージドリブンBeanに関連付けるインターセプタ・クラスに指定できます(「EJB 3.0 MDBのインターセプタ・クラスのAroundInvokeインターセプタ・メソッドの構成」を参照)。

詳細は、「EJB 3.0インターセプタについて」を参照してください。

アノテーションの使用方法

例10-11に、@AroundInvokeアノテーションを使用してメッセージドリブンBeanクラスのメソッドをインターセプタ・メソッドとして指定する方法を示します。onMessageメソッドが起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドmyInterceptorを起動します。onMessageメソッド起動は、インターセプタ・メソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

例10-11    EJB 3.0メッセージドリブンBeanの@AroundInvoke

@MessageDriven
public class MessageLogger implements MessageListene {
    @Resource javax.ejb.MessageDrivenContext mc;

    public void onMessage(Message message) {
    ....
    }

    @AroundInvoke
    public Object myInterceptor(InvocationContext ctx) throws Exception {
        if (!userIsValid(ctx. getEJBContext().getCallerPrincipal())) {
            throw new SecurityException(
                "Caller: '" + ctx.getEJBContext().getCallerPrincipal().getName() +
                "' does not have permissions for method " + ctx.getMethod()
            );
        }
        return ctx.proceed();
    }
}

 

EJB 3.0 MDBのインターセプタ・クラスのAroundInvokeインターセプタ・メソッドの構成

1つの非ビジネス・メソッドをEJB 3.0メッセージドリブンBeanのインターセプタ・メソッドとして指定できます。onMessageメソッドが起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドを起動します。onMessageの起動は、インターセプタ・メソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

このメソッドは、EJB 3.0 MDBに関連付けるインターセプタ・クラスに指定するか、
EJB 3.0 MDBクラスそれ自体に指定できます(「EJB 3.0 MDBのAroundInvokeインターセプタ・メソッドの構成」を参照)。

インターセプタ・クラスでインターセプタ・メソッドを構成するには、次のようにします。

  1. インターセプタ・クラスを作成します。

    これは、任意のPOJOクラスにすることができます。

  2. インターセプタ・メソッドを実装します。

    インターセプタ・メソッドには次のシグネチャがあります。

    Object <METHOD>(InvocationContext) throws Exception
    
    

    インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。

  3. メソッドをインターセプタ・メソッドとして指定します(「アノテーションの使用方法」を参照)。

  4. インターセプタ・クラスをEJB 3.0 MDBに関連付けます(「EJB 3.0 MDBのインターセプタ・クラスの構成」を参照)。

詳細は、「EJB 3.0インターセプタについて」を参照してください。

アノテーションの使用方法

例10-12に、@AroundInvokeアノテーションを使用してインターセプタ・クラス・メソッドのmyInterceptorをEJB 3.0 MDBのインターセプタ・メソッドとして指定する方法を示します。このインターセプタ・クラスをMDBに関連付けると(「EJB 3.0 MDBのインターセプタ・クラスの構成」を参照)、onMessageメソッドが起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドmyInterceptorを起動します。onMessageメソッド起動は、インターセプタ・メソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

例10-12    インターセプタ・クラス

public class MyInterceptor {
    ...
    @AroundInvoke
    protected Object myInterceptor(InvocationContext ctx) throws Exception {
        Principal p = ctx.getEJBContext().getCallerPrincipal;
        if (!userIsValid(p)) {
            throw new SecurityException(
                "Caller: '" + p.getName() +
                "' does not have permissions for method " + ctx.getMethod()
            );
        }
        return ctx.proceed();
    }

    @PreDestroy
    public void myPreDestroyMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }
}

 

EJB 3.0 MDBのインターセプタ・クラスの構成

インターセプタ・クラスは、Beanクラスそれ自体とは異なる1つのクラスであり、そのメソッドはBeanのビジネス・メソッドの起動およびライフ・サイクル・イベントの発生に応じて起動されます。Beanクラスは、任意の数のインターセプタ・クラスに関連付けることができます。

インターセプタ・クラスは、EJB 3.0メッセージドリブンBeanに関連付けることができます。

インターセプタ・クラスを使用してEJB 3.0メッセージドリブンBeanを構成するには、次のようにします。

  1. インターセプタ・クラスを作成します(「インターセプタ・クラスの作成」を参照)。

    これは、任意のPOJOクラスにすることができます。

  2. インターセプタ・クラスにインターセプタ・メソッドを実装します。

    インターセプタ・メソッドには次のシグネチャがあります。

    Object <METHOD>(InvocationContext) throws Exception
    
    

    インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。

    インターセプタ・メソッドには、ライフ・サイクル・コールバックとして(「EJB 3.0 MDBのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)、またはAroundInvokeメソッドとして(「EJB 3.0 MDBのインターセプタ・クラスのAroundInvokeインターセプタ・メソッドの構成」を参照)アノテーションを付けることができます。

  3. インターセプタ・クラスをEJB 3.0メッセージドリブンBeanに関連付けます(「インターセプタ・クラスとMDBとの関連付け」を参照)。

  4. オプションで、シングルトン・インターセプタを使用するようメッセージドリブンBeanを構成します(「MDBでのシングルトン・インターセプタの指定」を参照)。

アノテーションの使用方法

この項の内容は次のとおりです。

インターセプタ・クラスの作成

例10-13に、EJB 3.0メッセージドリブンBeanのインターセプタ・クラスにAroundInvokeインターセプタ・メソッドおよびライフ・サイクル・コールバック・インターセプタ・メソッドを指定する方法を示します。このインターセプタ・クラスをメッセージドリブンBeanに関連付けると(例10-14を参照)、onMessageメソッドが起動するたびに、OC4Jは起動をインターセプトし、AroundInvokeメソッドのmyInterceptorを起動します。適切なライフ・サイクル・イベントが発生すると、OC4JはmyPreDestroyMethodなどの対応するライフ・サイクル・コールバック・インターセプタ・メソッドを起動します。

例10-13    インターセプタ・クラス

public class MyInterceptor {
    ...
    @AroundInvoke
    protected Object myInterceptor(InvocationContext ctx) throws Exception {
        Principal p = ctx.getEJBContext().getCallerPrincipal;
        if (!userIsValid(p)) {
            throw new SecurityException(
                "Caller: '" + p.getName() +
                "' does not have permissions for method " + ctx.getMethod()
            );
        }
        return ctx.proceed();
    }

    @PreDestroy
    public void myPreDestroyMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }
}

 

インターセプタ・クラスとMDBとの関連付け

インターセプタ・クラスは、@Interceptorsアノテーションを使用してEJB 3.0メッセージドリブンBeanに関連付けることができます。例10-14に、例10-13のインターセプタ・クラスをEJB 3.0メッセージドリブンBeanクラスに関連付ける方法を示します。

@PostConstructのライフ・サイクル・メソッドは、EJB 3.0メッセージドリブンBeanクラスそれ自体のメソッドですが(「EJB 3.0 MDBのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)、@PreDestroyのライフ・サイクル・メソッドは、このメッセージドリブンBeanに関連付けられたインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドです(「EJB 3.0 MDBのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)。

例10-14    インターセプタ・クラスとEJB 3.0 MDBの関連付け

@MessageDriven
@Interceptors(MyInterceptor.class)
public class MessageLogger implements MessageListener {
    @Resource javax.ejb.MessageDrivenContext mc;

    public void onMessage(Message message) {
    ....
    }

    @PostConstruct
    public void initialize() {
        items = new ArrayList();
    }
    ...
}

 

MDBでのシングルトン・インターセプタの指定

例10-15に示すように、@MessageDrivenDeploymentの属性interceptorTypesingletonに設定することで、シングルトン・インターセプタ・クラスを使用するようOC4Jを構成できます。このメッセージドリブンBeanのすべてのインスタンスは、MyInterceptorの同じインスタンスを共有します。MyInterceptorクラスは、ステートレスである必要があります。

この属性の詳細は、表A-3を参照してください。シングルトン・インターセプタの詳細は、「シングルトン・インターセプタ」を参照してください。

例10-15    EJB 3.0 MDBでのシングルトン・インターセプタ・クラスの指定

@MessageDriven
@MessageDrivenDeployment(interceptorType="singleton")
@Interceptors(MyInterceptor.class)
public class MessageLogger implements MessageListener {
    @Resource javax.ejb.MessageDrivenContext mc;

    public void onMessage(Message message) {
    ....
    }

    @PostConstruct
    public void initialize() {
        items = new ArrayList();
    }
    ...
}

 

EJB 3.0 MDBのOC4J固有のデプロイ・オプションの構成

EJB 3.0メッセージドリブンBeanのOC4J固有のデプロイ・オプションは、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)を使用して構成できます。

orion-ejb-jar.xmlファイルの構成は、OC4J固有のアノテーションを使用して設定された対応する構成をオーバーライドします。

詳細は、「メッセージ・サービス構成オプション: アノテーションまたはXMLの選択と属性またはアクティブ化構成プロパティの選択」を参照してください。

アノテーションの使用方法

EJB 3.0メッセージドリブンBeanのOC4J固有のデプロイ・オプションは、OC4J固有の@MessageDrivenDeploymentアノテーションを使用して指定できます。

例10-16に、@MessageDrivenDeploymentアノテーションを使用してEJB 3.0メッセージドリブンBeanのOC4J固有のデプロイ・オプションを構成する方法を示します。@MessageDrivenDeploymentの属性の詳細は、表A-3を参照してください。

@MessageDrivenアノテーションのactivationConfig属性設定(「J2CAを使用してメッセージ・サービス・プロバイダにアクセスするためのEJB 3.0 MDBの構成」を参照)は、@MessageDrivenDeploymentの属性を使用してアクティブ化構成プロパティを設定することでオーバーライドできます。アノテーション構成は、デプロイXMLを使用してオーバーライドできます(「デプロイXMLの使用方法」を参照)。

例10-16    @MessageDrivenDeployment

import javax.ejb.MessageDriven;
import oracle.j2ee.ejb.MessageDrivenDeployment;
import javax.ejb.ActivationConfigProperty;
import javax.annotation.Resource;

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
            propertyName="messageListenerInterface",
            propertyValue="javax.jms.MessageListener"),
        @ActivationConfigProperty(
            propertyName="connectionFactoryJndiName",
            propertyValue="jms/TopicConnectionFactory"),
         @ActivationConfigProperty(
            propertyName="destinationName",
            propertyValue="jms/demoTopic"),
         @ActivationConfigProperty(
            propertyName="destinationType",
            propertyValue="javax.jms.Topic"),
         @ActivationConfigProperty(
            propertyName="messageSelector",
            propertyValue="RECIPIENT = 'MDB'")
    }
)
@MessageDrivenDeployment(
    maxInstances=10,
    poolCacheTimeout=30
)
public class MessageLogger implements MessageListener, TimedObject {
    @Resource javax.ejb.MessageDrivenContext mc;

    public void onMessage(Message message) {
    ...
    }

    public void ejbTimeout(Timer timer) {
    ...
    }
}

 

デプロイXMLの使用方法

例10-17に示すように、メッセージドリブンBeanのOC4J固有のデプロイ・オプションは、orion-ejb-jar.xmlファイルの<message-driven-deployment>要素を使用して指定できます。<message-driven-deployment>要素の詳細は、「<message-driven-deployment>」を参照してください。

例10-17    orion-ejb-jar.xmlファイルの<message-driven-deployment>要素

<?xml version="1.0" encoding="utf-8"?>
<orion-ejb-jar
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-ejb-jar-10_0.xsd"
    deployment-version="10.1.3.1.0"
    deployment-time="10b1fb5cdd0"
    schema-major-version="10"
    schema-minor-version="0"
>
    <enterprise-beans>
        <message-driven-deployment
            name="MessageLogger"
            max-instances="10"
            cache-timeout="30"
            ...
        >
        </message-driven-deployment>
    ...
    </enterprise-beans>
    ...
</orion-ejb-jar>


戻る 次へ
Oracle
Copyright © 2002, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引