ORACLE JAPAN Server Release 7.0

 

  |  

  WebLogic Server ホーム   |     エンタープライズ JavaBeans   |   前へ   |   次へ   |   目次   |   PDF 版

メッセージ駆動型 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 を作成するには、次の手順に従います。

  1. javax.ejb.MessageDrivenBean インタフェースと javax.jms.MessageListener インタフェースを両方とも実装するソース ファイル (メッセージ駆動型 Bean クラス) を作成します。

    メッセージ駆動型 Bean クラスでは、以下のメソッドを定義する必要があります。

    メッセージ駆動型 Bean クラスの出力例について、詳しくは メッセージ駆動型 Bean の呼び出しを参照してください。

  2. メッセージ駆動型 Bean に対して、次の XML デプロイメント記述子ファイルを指定します。

    XML ファイルの指定について、詳しくはEJB デプロイメント記述子の指定と編集を参照してください。

  3. Bean の ejb-jar.xml ファイルで message-driven 要素を設定して、Bean を宣言します。

  4. Bean の ejb-jar.xml ファイルで message-driven-destination 要素を設定して、Bean がトピック用かキュー用かを指定します。

  5. 関連付けられたトピックを恒久トピックとするかどうかを指定するときは、Bean の ejb-jar.xml ファイルで subscription-durability サブ要素を指定します。

  6. Bean で独自のトランザクション境界を設定する場合、使用する JMS 確認応答を指定するために acknowledge-mode サブ要素を設定します。この要素の値は AUTO_ACKNOWLEDGE(デフォルト)または DUPS_OK_ACKNOWLEDGE のいずれかです。

  7. トランザクション境界をコンテナで管理する場合、Bean の ejb-jar.xml ファイルで transaction-type 要素を設定して、メソッド呼び出しをエンタープライズ Bean のメソッドに委託するときにコンテナがトランザクション境界を管理する方式を指定します。

次の例は、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>

  1. Bean の weblogic-ejb-jar.xml ファイルで message-driven-descriptor 要素を設定して、メッセージ駆動型 Bean を WebLogic Server における JMS 送り先と関連付けます。

次の例は、weblogic-ejb-jar.xml ファイルでのメッセージ駆動型 Bean の設定方法を示したものです。

図3-2 weblogic-ejb-jar.xml ファイルの XML スタンザの例

<message-driven-descriptor>
	<destination-jndi-name>...</destination-jndi-name>
</message-driven-descriptor>

  1. デプロイメント ディレクトリへの EJB のパッケージ化の手順に従って、メッセージ駆動型 Bean クラスをコンパイルして生成します。

  2. コンパイル済み EJB ファイルのデプロイの手順に従って、Bean を WebLogic Server にデプロイします。

コンテナは、メッセージ駆動型 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 を作成し、プリンシパルを指定し、パーミッションを設定するには、次の手順に従います。

  1. WebLogic Server Administration Console を起動します。

  2. Administration Console の左ペインで、[セキュリティ] →[ACL] ノードに移動します。

  3. Administration Console の右ペインで、[新しい ACL の作成] リンクをクリックします。

    [ACL コンフィグレーション] ウィンドウが表示されます。

  4. [新しい ACL 名] フィールドに、ACL を使用して保護する WebLogic Server リソースの名前を指定します。

    たとえば、topic という名前の JMS 送り先用の ACL を作成します。

  5. [作成] をクリックします。

  6. [新しい Permission を追加] リンクをクリックします。

  7. JMS 送り先リソース topic に対して receive パーミッションを指定します。

  8. リソースに対して指定されたパーミッションを持つユーザとして run-as-principal ユーザを指定します。

  9. [適用] をクリックします。

恒久サブスクライバとしてのメッセージ駆動型 Bean の指定

メッセージ駆動型 Bean をトピックに関連付ける場合、トピックを恒久的なものとして指定できます。トピックの恒久サブスクリプションは、サーバが動作していない場合でもメッセージが失われないことを保証します。サーバが切断された場合でも、恒久的なトピックが引き続きメッセージを受信して格納し、サーバは再起動されるとメッセージの受信を再開します。メッセージ駆動型 Bean をトピックに関連付ける一方でトピックを恒久的なものとして指定しない場合、デフォルトでトピックは非恒久的となります。

メッセージ駆動型 Bean を恒久サブスクライバとして設定するには、以下のデプロイメント記述子要素を指定します。

  1. Bean の ejb-jar.xml ファイルの message-driven-destination 要素を設定して、Bean の用途をトピックまたはキューのどちらにするかを指定します。

  2. 関連付けられたトピックを恒久的にするかどうかを指定するときは、Bean の ejb-jar.xml ファイルの subscription-durability サブ要素を設定します。

  3. Bean の weblogic-ejb-jar.xml ファイルの jms-client-id 要素を設定します。

    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 を呼び出します。

  1. WebLogic Server が新しい Bean インスタンスを取得します。

    WebLogic Server では、weblogic-ejb-jar.xml ファイルで設定される max-beans-in-free-pool 属性を使用して、新しい Bean インスタンスがフリー プールで使用可能かどうかを判定します。

  2. Bean インスタンスがフリー プールで使用可能な場合、WebLogic Server はそのインスタンスを使用します。max-beans-in-free-pool 属性が maxBeans (最大設定) に達したためフリー プールに使用可能な Bean インスタンスがない場合、WebLogic Server は Bean インスタンスが解放されるまで待機します。この属性の詳細については、max-beans-in-free-poolを参照してください。

    Bean インスタンスがフリー プールにない場合、WebLogic Server は Bean の ejbCreate()メソッドを呼び出して新しい Bean インスタンスを作成し、続けて Bean の setMessageDrivenContext() メソッドを呼び出してそのインスタンスをコンテナ コンテキストに関連付けます。Bean では、メッセージ駆動型 Bean コンテキストの使用で説明されているようにこのコンテキストの要素を利用できます。

  3. WebLogic Server では、Bean に関連付けられている JMS キューまたはトピックでメッセージを受け取ると、Bean の onMessage() メソッドを呼び出して、ビジネス ロジックを実装します。

    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 デプロイメント記述子要素を使用して確認応答のセマンティクスをコンフィグレーションできます。

 

back to top previous page next page