![]() |
![]() |
|
|
| |
メッセージ駆動型 Bean の使い方
以下の節では、メッセージ駆動型 Bean を開発し、WebLogic Server にデプロイする方法について説明します。メッセージ駆動型 Bean では標準の JMS API を部分的に利用するので、メッセージ駆動型 Bean を実装する前に WebLogic Java Messaging Service(JMS)を理解する必要があります。詳細については、『WebLogic JMS プログラマーズ ガイド』を参照してください。
注意: メッセージ駆動型 Bean は EJB 2.0 の機能です。
メッセージ駆動型 Bean とは
メッセージ駆動型 Bean は、WebLogic JMS メッセージング システムでメッセージ コンシューマとして機能する EJB です。標準の JMS メッセージ コンシューマの場合と同じように、メッセージ駆動型 Bean では JMS キューまたは JMS トピックからメッセージを受信し、そのメッセージの内容に基づいてビジネス ロジックを実行します。メッセージ駆動型 Bean はデプロイメント時にトピックやキューなどの JMS 送り先と関連付けられ、受信メッセージを処理するために必要になった時点で、WebLogic Server によってメッセージ駆動型 Bean のインスタンスが自動的に作成および削除されます。
メッセージ駆動型 Bean と標準の JMS コンシューマとの違い
メッセージ駆動型 Bean は EJB として実装されるため、標準の JMS コンシューマでは利用できないサービスからの恩恵を受けます。最も重要なことは、メッセージ駆動型 Bean のインスタンスは、全面的に WebLogic Server EJB コンテナによって管理されるということです。1 つのメッセージ駆動型 Bean クラスを使用することで、WebLogic Server では大量のメッセージを並行して処理するために必要に応じて複数の EJB インスタンスが作成されます。それとは対照的に、標準的な JMS メッセージング システムの場合は、サーバ全体のセッション プールを利用する MessageListener クラスを開発者が作成しなければなりません。
WebLogic Server コンテナでは、セキュリティ サービスや自動トランザクション管理など、他の標準的な EJB サービスもメッセージ駆動型 Bean に対して提供されます。それらのサービスの詳細については、トランザクション管理と メッセージ駆動型 Bean でのトランザクション サービスの使用を参照してください。
また、メッセージ駆動型 Bean は、EJB の「一度書けば、どこにでもデプロイできる」性質からも恩恵を受けます。JMS MessageListener は特定のセッション プール、キュー、またはトピックと関連付けられますが、メッセージ駆動型 Bean はサービス リソースにとらわれずに開発できます。メッセージ駆動型 Bean のキューとトピックはデプロイメント時にのみ割り当てられ、WebLogic Server にあるリソースが利用されます。
注意: 標準の JMS リスナにはないメッセージ駆動型 Bean の 1 つの制限は、特定のメッセージ駆動型 Bean のデプロイメントが 1 つのキューまたはトピックとしか関連付けられないことです(WebLogic Server でのメッセージ駆動型 Bean のデプロイを参照)。アプリケーションにおいて、1 つの JMS コンシューマで複数のキューまたはトピックからのメッセージに対応しなければならない場合は、標準の JMS コンシューマを使用するか、または複数のメッセージ駆動型 Bean クラスをデプロイする必要があります。
メッセージ駆動型 Bean とステートレス セッション EJB との違い
メッセージ駆動型 Bean のインスタンスの動的な作成と割り当ては、ステートレス セッション EJB のインスタンスの動作にいくつかの点で似ています。ただし、メッセージ駆動型 Bean は、以下のような重要な点でステートレス セッション EJB(および他の種類の EJB)とは異なります。
注意: WebLogic Server コンテナだけが、必要に応じて Bean のインスタンスを作成し、JMS メッセージをインスタンスに渡すことによってメッセージ駆動型 Bean と直接対話します。
トピックとキューの並行処理
メッセージ駆動型 Bean (MDB) は、トピックおよびキューの並行処理をサポートしています。以前は、キューの並行処理のみがサポートされていました。
同時実行性をサポートするには、コンテナで実行キューのスレッドを使用します。weblogic-ejb-jar.xml ファイルの max-beans-in-free-pool デプロイメント記述子のデフォルト設定では、ほとんどの並行処理がサポートされます。並行して実行されるコンシューマの数を制限する場合を除き、この値を変更しないでください。
注意: 複数のメッセージを一度に受信するために、max-beans-in-free-pool デプロイメント記述子を使って MDB の最大数をコンフィグレーションした場合、MDB の数は実行スレッドの最大数を超えることはできません。たとえば、max-beans-in-free-pool を 50 に設定しても、許容される実行スレッドの最大数が 25 の場合は、実際にメッセージを受信する MDB は 25 だけです。
max-beans-in-free-pool の詳細については、max-beans-in-free-poolを参照してください。
メッセージ駆動型 Bean の開発とコンフィグレーション
メッセージ駆動型 Beanを作成するには、Bean を適切に動作させるための一般的な慣習に従うだけでなく、JavaSoft EJB 2.0 仕様で説明されている規約にも従う必要があります。メッセージ駆動型 Bean クラスを作成したら、XML 形式の EJB デプロイメント記述子ファイルで Bean のデプロイメント記述子要素を指定することによって、WebLogic Server 用に Bean をコンフィグレーションします。
メッセージ駆動型 Bean を作成するには、次の手順に従います。
メッセージ駆動型 Bean クラスの出力例について、詳しくは メッセージ駆動型 Bean の呼び出しを参照してください。
XML ファイルの指定について、詳しくはEJB デプロイメント記述子の指定と編集を参照してください。
次の例は、ejb-jar.xml ファイルでのメッセージ駆動型 Bean の指定方法を示したものです。
図3-1 ejb-jar.xml ファイルの XML スタンザの例
<enterprise-beans>
<message-driven>
<ejb-name>exampleMessageDriven1</ejb-name>
<ejb-class>examples.ejb20.message.MessageTraderBean</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>
javax.jms.Topic
</destination-type>
</message-driven-destination>
...
</message-driven>
...
</enterprise-beans>
次の例は、weblogic-ejb-jar.xml ファイルでのメッセージ駆動型 Bean の設定方法を示したものです。
図3-2 weblogic-ejb-jar.xml ファイルの XML スタンザの例
<message-driven-descriptor>
<destination-jndi-name>...</destination-jndi-name>
</message-driven-descriptor>
コンテナは、メッセージ駆動型 Bean インスタンスを実行時に管理します。
メッセージ駆動型 Bean クラスの必要条件
EJB 2.0 仕様では、メッセージ駆動型 Bean クラスでメソッドを定義するための詳細なガイドラインが提供されます。次の出力は、メッセージ駆動型 Bean クラスの基本的な構成要素を示しています。クラス、メソッド、およびメソッド宣言は、太字で表示されています。
コード リスト 3-1 メッセージ駆動型 Bean の基本コンポーネントの出力例
public class MessageTraderBean implements MessageDrivenBean, MessageListener{
public MessageTraderBean() {...};
// EJB コンストラクタは必須。パラメータは
// 受け付けない。コンストラクタは
// abstract としては宣言しない
public void ejbCreate() (...)
// ejbCreate () は必須。パラメータは受け付けない throws
// 句を使用する場合は、アプリケーション例外を含めない。
// ejbCreate() は final または static としては宣言しない
public void onMessage(javax.jms.Message MessageName) {...}
// onMessage() は必須であり、javax.jms.Message 型の
// パラメータを必ず 1 つとる。throws 句を使用する場合は
// アプリケーション例外を含めない。onMessage() は final
// または static としては宣言しない
public void ejbRemove() {...}
// ejbRemove() は必須。パラメータは受け付けない。
// throws 句を使用する場合は、アプリケーション例外を含めない。
// ejbRemove() は final または static としては宣言しない
// EJB クラスでは finalize() メソッドを定義できない
}
メッセージ駆動型 Bean コンテキストの使用
WebLogic Server では、setMessageDrivenContext() を呼び出して、メッセージ駆動型 Bean インスタンスをコンテナ コンテキストと関連付けます。これは、クライアント コンテキストではありません。クライアント コンテキストは、JMS メッセージでは渡されません。WebLogic Server では、コンテナ コンテキストが EJB に提供されます。そのプロパティには、MessageDrivenContext インタフェースの以下のメソッドを使用して Bean のインスタンスからアクセスできます。
注意: getEJBHome() も MessageDrivenContext インタフェースの一部として継承されますが、メッセージ駆動型 Bean にはホーム インタフェースがありません。メッセージ駆動型 EJB のインスタンスから getEJBHome() を呼び出すと、IllegalStateException が送出されます。
onMessage() によるビジネス ロジックの実装
メッセージ駆動型 Bean の onMessage() メソッドでは、その EJB のビジネス ロジックが実装されます。WebLogic Server では、EJB と関連付けられている JMS キューまたは JMS トピックがメッセージを受信したときに、JMS メッセージ オブジェクトをそのまま引数として渡して onMessage() を呼び出します。メッセージを解析し、onMessage() の必要なビジネス ロジックを実行するのは、メッセージ駆動型 Bean の役割です。
ビジネス ロジックが非同期のメッセージ処理に対応できるようにしておきます。たとえば、EJB では、クライアントから送信された順序でメッセージを受信できるわけではありません。コンテナでのインスタンス プーリングにより、メッセージが順番に受信または処理されることはありません。ただし、メッセージ駆動型 Bean の特定のインスタンスに対する個々の onMessage() 呼び出しはシリアライズされます。
詳細については、javax.jms.MessageListener.onMessage() を参照してください。
JMS 送り先に対するプリンシパルの指定とパーミッションの設定
メッセージ駆動型 Bean は、run-as プリンシパルを使用して JMS 送り先に接続します。run-as プリンシパルは、ejb-jar.xml ファイルで設定する run-as 要素に対応します。この設定では、メッセージ駆動型 Bean のメソッドの実行に使われる run-as ID を指定します。WebLogic Server コンテナにメッセージ駆動型 Bean をデプロイすると、Bean は JMS の送り先と関連付けられます。JMS の送り先はキューまたはトピックのどちらかです。JMS の送り先は、メッセージ駆動型 Bean の ejb-jar.xml ファイルで、jms-destination-type 要素に値 queue または topic を設定することによって指定します。
メッセージ駆動型 Bean を JMS の送り先に接続するときは、後で説明するように、Bean の run-as プリンシパルに対するパーミッションを receive に設定します。これによりメッセージ駆動型 Bean は、同じドメイン内のリモート キューに接続できるようになり、ほかのドメイン内で同じプリンシパルが定義されていれば別のドメイン内のリモート キューにも接続できます。run-as プリンシパルを指定しない場合、WebLogic Server はデフォルトの guest ユーザを使用します。ただし、run-as プリンシパルと guest のどちらを使用する場合でも、セキュリティ プリンシパルに receive パーミッションを割り当てる必要があります。
receive パーミッションを設定するには、まず新しいアクセス制御リスト(ACL)を作成するか、または既存のリストを修正する必要があります。ACL はリソースにアクセスするためのパーミッションを持つユーザおよびグループのリストです。パーミッションはリソースにアクセスするために必要な権限で、ファイルの読み取り、書き込み、送信、および受信、サーブレットのロード、ライブラリへのリンクなどを行うためのパーミッションがあります。
注意: JMS の送り先に接続するメッセージ駆動型 Bean に対しては、system ユーザを使用しないでください。system を使用すると、別のドメイン内にある送り先にメッセージ駆動型 Bean が接続できません。
セキュリティ プリンシパル ユーザの詳細については、「ユーザの定義」を参照してください。
ACL を作成し、プリンシパルを指定し、パーミッションを設定するには、次の手順に従います。
恒久サブスクライバとしてのメッセージ駆動型 Bean の指定
メッセージ駆動型 Bean をトピックに関連付ける場合、トピックを恒久的なものとして指定できます。トピックの恒久サブスクリプションは、サーバが動作していない場合でもメッセージが失われないことを保証します。サーバが切断された場合でも、恒久的なトピックが引き続きメッセージを受信して格納し、サーバは再起動されるとメッセージの受信を再開します。メッセージ駆動型 Bean をトピックに関連付ける一方でトピックを恒久的なものとして指定しない場合、デフォルトでトピックは非恒久的となります。
メッセージ駆動型 Bean を恒久サブスクライバとして設定するには、以下のデプロイメント記述子要素を指定します。
XML ファイルの要素を指定する方法については、EJB デプロイメント記述子の指定と編集を参照してください。
注意: 標準の JMS リスナの代わりにメッセージ駆動型 Bean を使用してメッセージを処理する場合、個々のメッセージ駆動型 Bean は 1 つのトピックだけに関連付けることをお勧めします。アプリケーションにおいて、単一の JMS コンシューマによって複数のトピックまたはキューからのメッセージを処理しなければならない場合、標準の JMS コンシューマを使用するか、複数のメッセージ駆動型 Bean クラスをデプロイする必要があります。
JMS サーバまたは外部サービス プロバイダへの再接続
メッセージ駆動型 Bean は、クラスタ化されていない WebLogic Server インスタンスにデプロイされた JMS サーバ上、または外部のサービス プロバイダ上にある関連付けられた JMS 送り先をリスンします。サーバが停止したために送り先への接続が失われると、メッセージ駆動型 Bean はその送り先への再接続を定期的に試みます。送り先への再接続を試みる間隔の秒数は、Bean の weblogic-ejb-jar.xml ファイルの jms-polling-interval-seconds 要素を設定することで指定できます。
XML ファイルを指定する方法については、EJB デプロイメント記述子の指定と編集を参照してください。
例外の処理
メッセージ駆動型 Bean のメソッドは、onMessage() であっても、アプリケーション例外または RemoteException を送出してはなりません。メソッドでそのような例外が送出されると、WebLogic Server では ejbRemove() を呼び出すことなく即座に EJB のインスタンスが削除されます。ただし、クライアントの観点からすれば、その EJB は依然として存在していることになります。なぜなら、以降のメッセージは WebLogic Server によって作成される新しい Bean インスタンスに転送されるからです。
メッセージ駆動型 Bean の呼び出し
JMS キューまたは JMS トピックがメッセージを受信すると、WebLogic Server では次のようにして関連するメッセージ駆動型 Bean を呼び出します。
WebLogic Server では、weblogic-ejb-jar.xml ファイルで設定される max-beans-in-free-pool 属性を使用して、新しい Bean インスタンスがフリー プールで使用可能かどうかを判定します。
Bean インスタンスがフリー プールにない場合、WebLogic Server は Bean の ejbCreate()メソッドを呼び出して新しい Bean インスタンスを作成し、続けて Bean の setMessageDrivenContext() メソッドを呼び出してそのインスタンスをコンテナ コンテキストに関連付けます。Bean では、メッセージ駆動型 Bean コンテキストの使用で説明されているようにこのコンテキストの要素を利用できます。
onMessage() によるビジネス ロジックの実装を参照してください。
注意: これらのインスタンスはプールに配置できます。
Bean インスタンスの作成と削除
WebLogic Server コンテナでは、メッセージ駆動型 Bean の ejbCreate() および ejbRemove() メソッドを呼び出して、Bean クラスのインスタンスを作成または削除します。各メッセージ駆動型 Bean には、少なくとも 1 つの ejbCreate() および ejbRemove() メソッドが必要です。WebLogic Server コンテナでは、これらのメソッドを使用して、JMS キューまたはトピックからメッセージを受信して Bean インスタンスが作成されたときに作成関数を、トランザクションがコミットされて Bean インスタンスが削除されたときに削除関数を処理します。
WebLogic Server は JMS キューまたはトピックからメッセージを受け取ります。
他の EJB タイプの場合と同じように、ejbCreate() メソッドでは Bean の活動に必要なあらゆるリソースを用意しなければなりません。ejbRemove() メソッドでは、WebLogic Server によってインスタンスが削除される前にリソースを解放しなければなりません。
メッセージ駆動型 Bean では、ejbRemove() メソッドの外側においても何らかのかたちで通常のクリーンアップ ルーチンを実行する必要があります。なぜなら、実行時例外が送出されるなどして、ejbRemove() が呼び出されないこともあり得るからです。
WebLogic Server でのメッセージ駆動型 Bean のデプロイ
メッセージ駆動型 Bean のデプロイ先は、初めて起動した場合の WebLogic Server、または実行中の WebLogic Server です。Bean のデプロイの詳細については、WebLogic Server 起動時の EJB のデプロイメントまたは 動作中の WebLogic Server への EJB のデプロイを参照してください。
メッセージ駆動型 Bean でのトランザクション サービスの使用
その他の型の EJB と同じく、メッセージ駆動型 Bean では Bean 管理のトランザクションを使用して独自のトランザクション境界を設定することも、WebLogic Server のコンテナにトランザクションを管理させる(コンテナ管理のトランザクション)こともできます。どちらの場合でも、メッセージ駆動型 Bean が、メッセージを送信するクライアントからトランザクション コンテキストを受け取ることはありません。WebLogic Server では常に、Bean のデプロイメント記述子ファイルで指定されたトランザクション コンテキストを使用して Bean の onMessage() メソッドを呼び出します。
クライアントは呼び出しに対するトランザクション コンテキストをメッセージ駆動型 Bean に提供しないので、ejb-jar.xml ファイルの container-transaction 要素に対して指定されている trans-attribute の値 (Required または NotSupported) に従って、コンテナ管理のトランザクションを使用する Bean をデプロイする必要があります。
ejb-jar.xml ファイルの次の例は、メッセージ駆動型 Bean のトランザクション コンテキストの指定方法を示しています。
コード リスト 3-2 ejb-jar.xml ファイルの XML スタンザの例
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>MyMessageDrivenBeanQueueTx</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
</assembly-descriptor>
メッセージの受信
EJB の onMessage() メソッドを呼び出すきっかけとなる JMS メッセージの受信は、通常はトランザクションのスコープには含まれません。ただし、Bean 管理のトランザクションとコンテナ管理のトランザクションに関しては別の方法で処理されます。
メッセージの確認応答
コンテナ管理によるトランザクションの境界設定を使用するメッセージ駆動型 Bean の場合は、EJB トランザクションがコミットされたときに WebLogic Server で自動的にメッセージの確認応答が行われます。EJB で Bean 管理のトランザクションが使用される場合、メッセージの受信と確認応答は両方とも EJB トランザクション コンテキストの外側で行われます。Bean 管理のトランザクションを使用する EJB では WebLogic Server によって自動的にメッセージの確認応答が行われますが、ejb-jar.xml ファイルで定義される acknowledge-mode デプロイメント記述子要素を使用して確認応答のセマンティクスをコンフィグレーションできます。
![]() |
![]() |
![]() |