Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド 10g(10.1.3.1.0) B31852-03 |
|
この章では、EJB 3.0メッセージドリブンBeanを使用するために構成する必要のある様々なオプションについて説明します。
表10-1に、これらのオプションをリストし、基本オプション(ほとんどのアプリケーションに適用可能)であるか拡張オプション(より特殊なアプリケーションに適用可能)であるかを示します。
詳細は、次を参照してください。
表10-1 EJB 3.0メッセージドリブンBeanの構成オプション
オプション | タイプ |
---|---|
基本 |
|
基本 |
|
拡張 |
|
拡張 |
|
基本 |
|
拡張 |
|
拡張 |
|
拡張 |
|
拡張 |
|
基本 |
|
拡張 |
|
拡張 |
|
拡張 |
|
拡張 |
|
拡張 |
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を構成するには、次のようにします。
OC4J固有の@MessageDrivenDeployment
アノテーションのresourceAdapter属性(例10-1を参照)、またはそれと同等のorion-ejb-jar.xml
ファイルの<message-driven-deployment>
要素のresource-adapter属性(「デプロイXMLの使用方法」を参照)を使用できます。
アクティブ化構成プロパティは、@MessageDrivenDeployment
および@MessageDriven
アノテーション(例10-1を参照)とデプロイXML(「デプロイXMLの使用方法」を参照)の任意の組合せを使用して指定できます。
詳細は、次を参照してください。
例10-1に、OracleASjms
という名前のOracle JMSリソース・アダプタを使用するようにメッセージドリブンBeanを構成する方法を示します。メッセージ・サービス・プロバイダの構成時に、コネクション・ファクトリOracleASjms/MyQCF
をoc4j-ra.xml
ファイルに定義し、接続先名OracleASjms/MyQueue
をoc4j-connectors.xml
ファイルに定義してあることを前提とします。2フェーズ・コミット(2PC)をサポートするXA対応ファクトリを定義するか、または2PCサポートが必要でない場合は非XAファクトリを定義します。J2CAメッセージ・サービス・プロバイダの構成の詳細は、「メッセージ・サービス・プロバイダで使用するための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="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メッセージ・サービス・プロバイダのコネクション・ファクトリ名」を参照してください。
J2CAリソース・アダプタを使用してJMSメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成するには、EJB 2.1 MDBの場合と同様に(「デプロイXMLの使用方法」を参照)、ejb-jar.xml
とorion-ejb.jar.xml
という2つのデプロイXMLファイルを使用する必要があります。
アノテーション構成が存在する場合(「アノテーションの使用方法」を参照)、このデプロイXML構成でオーバーライドできます。
(J2CAリソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成できます。
これを行うには、アノテーション(「アノテーションの使用方法」を参照)またはデプロイXML(「デプロイXMLの使用方法」を参照)を使用します。
注意 メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどのJ2CAリソース・アダプタを使用してアクセスすることをお薦めします。詳細は、次を参照してください。
|
OC4Jでは、2フェーズ・コミット(2PC)トランザクション用のXAファクトリと、2PCを必要としないトランザクション用の非XAファクトリの両方がサポートされます。
詳細は、次を参照してください。
J2CAリソース・アダプタを使用せずにJMSメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成するには、次のようにします。
アクティブ化構成プロパティは、@MessageDrivenDeployment
アノテーション、@MessageDriven
アノテーションおよびデプロイXMLの任意の組合せを使用して指定できます。
詳細は、次を参照してください。
例10-2に、(J2CAリソース・アダプタを使用せずに)直接JMSメッセージ・サービス・プロバイダにアクセスするようメッセージドリブンBeanを構成する方法を示します。メッセージ・サービス・プロバイダの構成時に、コネクション・ファクトリjms/MyQCF
およびキューjms/MyQueue
を定義してあることを前提とします。2フェーズ・コミット(2PC)をサポートするXA対応ファクトリを定義するか、または2PCサポートが必要でない場合は非XAファクトリを定義します。メッセージ・サービス・プロバイダの構成の詳細は、第23章「メッセージ・サービスの構成」を参照してください。
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) {
...
}
}
使用する実際の名前は、メッセージ・サービス・プロバイダのインストール環境によって決まります。詳細は、次を参照してください。
(J2CAリソース・アダプタを使用せずに)直接JMSメッセージ・サービス・プロバイダにアクセスするようEJB 3.0 MDBを構成するには、EJB 2.1 MDBの場合と同様に(「デプロイXMLの使用方法」を参照)、ejb-jar.xml
とorion-ejb.jar.xml
という2つのデプロイXMLファイルを使用する必要があります。
アノテーション構成が存在する場合(「アノテーションの使用方法」を参照)、このデプロイXML構成でオーバーライドできます。
デフォルトでは、OC4Jはメッセージ・ロケーションのメッセージをポーリングするために1つの受信スレッドを使用します。
2つ以上の受信スレッドを使用すると、メッセージをパラレルに受信できるため、パフォーマンスが向上する可能性があります。
メッセージ・ロケーションがトピックの場合、受信スレッドの数は1に固定されます。
メッセージ・ロケーションがキューの場合、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xml
ファイル(「デプロイXMLの使用方法」を参照)を使用して受信スレッドの数を構成できます。
MDBプールのBeanインスタンスの最小数は、受信スレッドがメッセージ処理のためにプールからBeanインスタンスを取得できるように、少なくとも受信スレッドの数と同じに設定する必要があります。
詳細は、次を参照してください。
このオプションの構成方法は、使用するメッセージ・サービス・プロバイダへのアクセス方法によって決まります。
J2CAリソース・アダプタを使用してメッセージ・サービス・プロバイダにアクセスする場合、例10-3に示すようにアクティブ化構成プロパティReceiverThreadsを設定します。
ReceiverThreadsの詳細は、表B-2を参照してください。
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リソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスする場合、例10-4に示すようにOC4J固有のアノテーション@MessageDrivenDeployment
の属性listenerThreadsを設定します。
この@MessageDrivenDeployment
の属性の詳細は、表A-3を参照してください。@MessageDrivenDeployment
アノテーションの詳細は、「EJB 3.0 MDBのOC4J固有のデプロイ・オプションの構成」を参照してください。
注意 メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどの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) {
...
}
}
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リソース・アダプタを使用してメッセージ・サービス・プロバイダにアクセスする場合、例10-5に示すようにアクティブ化構成プロパティMaxDeliveryCntを設定します。
MaxDeliveryCntの詳細は、表B-2を参照してください。
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リソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスする場合、例10-6に示すようにOC4J固有のアノテーション@MessageDrivenDeployment
の属性maxDeliveryCountを設定します。
この@MessageDrivenDeployment
の属性の詳細は、表A-3を参照してください。@MessageDrivenDeployment
アノテーションの詳細は、「EJB 3.0 MDBのOC4J固有のデプロイ・オプションの構成」を参照してください。
注意 メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどの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) {
...
}
}
EJB 3.0メッセージドリブンBeanでは、EJB 2.1メッセージドリブンBeanと同様に、orion-ejb-jar.xml
ファイルで最大配信数を構成します(「デプロイXMLの使用方法」を参照)。
ネットワークやJMSサーバーの停止などのイベントを原因とする接続障害に対し、メッセージドリブンBeanのリスナー・スレッドでどのように応答するかを構成できます。
これらのオプションは、メッセージドリブンBeanのコンテナ管理のトランザクションにのみ適用されます。
接続障害リカバリ・オプションは、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xml
ファイル(「デプロイXMLの使用方法」を参照)を使用して構成できます。
詳細は、次を参照してください。
このオプションの構成方法は、使用するメッセージ・サービス・プロバイダのタイプによって決まります。
J2CAリソース・アダプタを使用してメッセージ・サービス・プロバイダにアクセスする場合、Oracle JMSコネクタは、JMSリソースのポーリングを無制限に再試行します。この再試行間隔は、例10-7に示すようにアクティブ化構成プロパティEndpointFailureRetryIntervalで構成できます。
再試行後のメッセージのリカバリでは、メッセージの順序は保証されません。また、JMSトピックに対するMDBサブスクリプションが非永続的な場合、メッセージは失われるか、重複する可能性があります。
詳細は、表B-2のEndpointFailureRetryIntervalを参照してください。
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リソース・アダプタを使用せずに)直接メッセージ・サービス・プロバイダにアクセスする場合、例10-8に示すようにOC4J固有のアノテーション@MessageDrivenDeployment
の属性dequeueRetryCountおよびdequeueRetryIntervalを設定します。
この@MessageDrivenDeployment
の属性の詳細は、表A-3を参照してください。@MessageDrivenDeployment
アノテーションの詳細は、「EJB 3.0 MDBのOC4J固有のデプロイ・オプションの構成」を参照してください。
注意 メッセージ・サービス・プロバイダには、Oracle JMSコネクタなどの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) {
...
}
}
EJB 3.0メッセージドリブンBeanでは、EJB 2.1メッセージドリブンBeanと同様に、orion-ejb-jar.xml
ファイルでデキュー再試行を構成します(「デプロイXMLの使用方法」を参照)。
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
をライフ・サイクル・コールバック・メソッドとして指定する方法を示します。
@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メッセージドリブンBeanのインターセプタ・クラスのインターセプタ・メソッドをライフ・サイクル・コールバック・インターセプタ・メソッドとして指定できます。
インターセプタ・クラスでライフ・サイクル・コールバック・インターセプタ・メソッドを構成するには、次のようにします。
これは、任意のPOJOクラスにすることができます。
インターセプタ・クラスは、引数のないpublicコンストラクタを保持する必要があります。
Beanのインターセプタ・クラスに定義するコールバック・メソッドには、次のシグネチャを割り当てます。
Object <METHOD>(InvocationContext)
1つのライフ・サイクル・イベントは、1つのコールバック・インターセプタ・メソッドにのみ関連付けることができますが、1つのライフ・サイクル・コールバック・インターセプタ・メソッドは、複数のコールバック・イベントに割り込むために使用できます。たとえば、@PostConstruct
と@PreDestroy
は、インターセプタ・クラス内で1回のみ出現可能ですが、@PostConstruct
と@PreDestroy
の両方を同じコールバック・インターセプタ・メソッドに関連付けることができます。
詳細は、次を参照してください。
詳細は、次を参照してください。
次のいずれかのアノテーションを使用して、インターセプタ・クラス・メソッドをEJB 3.0メッセージドリブンBeanのライフ・サイクル・コールバック・メソッドとして指定できます。
例10-10に、@PostConstruct
および@PreDestroy
アノテーションを使用して、myPostConstructMethod
およびmyPreDestroyMethod
をライフ・サイクル・コールバック・インターセプタ・メソッドとして指定する方法を示します。OC4Jは、適切なライフ・サイクル・イベントが発生した場合にのみ、対応するライフ・サイクル・メソッドを起動します。OC4Jは、メッセージドリブンBeanのビジネス・メソッドが起動されるたびに、ライフ・サイクル・インターセプタ・メソッド以外のすべてのインターセプタ・メソッド(myInterceptorMethod
など)を起動します(「EJB 3.0 MDBのインターセプタ・クラスの構成」を参照)。
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();
...
}
}
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()
を返す場合にのみ続行されます。
@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();
}
}
1つの非ビジネス・メソッドをEJB 3.0メッセージドリブンBeanのインターセプタ・メソッドとして指定できます。onMessage
メソッドが起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドを起動します。onMessage
の起動は、インターセプタ・メソッドがInvocationContext.proceed()
を返す場合にのみ続行されます。
このメソッドは、EJB 3.0 MDBに関連付けるインターセプタ・クラスに指定するか、
EJB 3.0 MDBクラスそれ自体に指定できます(「EJB 3.0 MDBのAroundInvokeインターセプタ・メソッドの構成」を参照)。
インターセプタ・クラスでインターセプタ・メソッドを構成するには、次のようにします。
これは、任意のPOJOクラスにすることができます。
インターセプタ・メソッドには次のシグネチャがあります。
Object <METHOD>(InvocationContext) throws Exception
インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。
詳細は、「EJB 3.0インターセプタについて」を参照してください。
例10-12に、@AroundInvoke
アノテーションを使用してインターセプタ・クラス・メソッドのmyInterceptor
をEJB 3.0 MDBのインターセプタ・メソッドとして指定する方法を示します。このインターセプタ・クラスをMDBに関連付けると(「EJB 3.0 MDBのインターセプタ・クラスの構成」を参照)、onMessage
メソッドが起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドmyInterceptor
を起動します。onMessage
メソッド起動は、インターセプタ・メソッドがInvocationContext.proceed()
を返す場合にのみ続行されます。
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();
...
}
}
インターセプタ・クラスは、Beanクラスそれ自体とは異なる1つのクラスであり、そのメソッドはBeanのビジネス・メソッドの起動およびライフ・サイクル・イベントの発生に応じて起動されます。Beanクラスは、任意の数のインターセプタ・クラスに関連付けることができます。
インターセプタ・クラスは、EJB 3.0メッセージドリブンBeanに関連付けることができます。
インターセプタ・クラスを使用してEJB 3.0メッセージドリブンBeanを構成するには、次のようにします。
これは、任意のPOJOクラスにすることができます。
インターセプタ・メソッドには次のシグネチャがあります。
Object <METHOD>(InvocationContext) throws Exception
インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。
インターセプタ・メソッドには、ライフ・サイクル・コールバックとして(「EJB 3.0 MDBのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)、またはAroundInvoke
メソッドとして(「EJB 3.0 MDBのインターセプタ・クラスのAroundInvokeインターセプタ・メソッドの構成」を参照)アノテーションを付けることができます。
この項の内容は次のとおりです。
例10-13に、EJB 3.0メッセージドリブンBeanのインターセプタ・クラスにAroundInvoke
インターセプタ・メソッドおよびライフ・サイクル・コールバック・インターセプタ・メソッドを指定する方法を示します。このインターセプタ・クラスをメッセージドリブンBeanに関連付けると(例10-14を参照)、onMessage
メソッドが起動するたびに、OC4Jは起動をインターセプトし、AroundInvoke
メソッドのmyInterceptor
を起動します。適切なライフ・サイクル・イベントが発生すると、OC4JはmyPreDestroyMethod
などの対応するライフ・サイクル・コールバック・インターセプタ・メソッドを起動します。
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();
...
}
}
インターセプタ・クラスは、@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のインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)。
@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();
}
...
}
例10-15に示すように、@MessageDrivenDeployment
の属性interceptorTypeをsingleton
に設定することで、シングルトン・インターセプタ・クラスを使用するようOC4Jを構成できます。このメッセージドリブンBeanのすべてのインスタンスは、MyInterceptor
の同じインスタンスを共有します。MyInterceptor
クラスは、ステートレスである必要があります。
この属性の詳細は、表A-3を参照してください。シングルトン・インターセプタの詳細は、「シングルトン・インターセプタ」を参照してください。
@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メッセージドリブン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の使用方法」を参照)。
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) {
...
}
}
例10-17に示すように、メッセージドリブンBeanのOC4J固有のデプロイ・オプションは、orion-ejb-jar.xml
ファイルの<message-driven-deployment>
要素を使用して指定できます。<message-driven-deployment>
要素の詳細は、「<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>
|
Copyright © 2002, 2008 Oracle Corporation. All Rights Reserved. |
|