4.2. メッセージ駆動 Bean が制御する配信
JBoss EAP は、特定の MDB でメッセージのアクティブな受信を制御する以下の属性を提供します。
4.2.1. Delivery Active
メッセージ駆動 Bean (MDB) の配信アクティブ (Delivery Active) 設定は、MDB がメッセージを受信しているかどうかを示します。MDB がメッセージを受信していない場合、メッセージはトピックまたはキューのルールに従ってキューまたはトピックに保存されます。
XML またはアノテーションを使用して delivery-group
の active
属性を設定できます。また、管理 CLI を使用してデプロイメント後にこの値を変更できます。デフォルトでは、active
属性が有効になり、MDB がデプロイされるとすぐにメッセージの配信が行われます。
Jboss-ejb3.xml ファイルでの Delivery Active の設定
Jboss-ejb3.xml
ファイルで active
の値を false
に設定し、MDB がデプロイされた直後にメッセージを受信しないことを示します。
<?xml version="1.1" encoding="UTF-8"?> <jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="urn:delivery-active:1.1" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1" impl-version="2.0"> <assembly-descriptor> <d:delivery> <ejb-name>HelloWorldQueueMDB</ejb-name> <d:active>false</d:active> </d:delivery> </assembly-descriptor> </jboss:ejb-jar>
アプリケーションのすべての MDB にアクティブな値を適用する場合は、ejb-name
の代わりにワイルドカード *
を使用できます。
アノテーションを使用した Delivery Active の設定
org.jboss.ejb3.annotation.DeliveryActive
アノテーションを使用することもできます。例を以下に示します。
@MessageDriven(name = "HelloWorldMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/HELLOWORLDMDBQueue"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") }) @DeliveryActive(false) public class HelloWorldMDB implements MessageListener { public void onMessage(Message rcvMessage) { // ... } }
Maven を使用してプロジェクトをビルドする場合は、以下の依存関係をプロジェクトの pom.xml
ファイルに追加してください。
<dependency> <groupId>org.jboss.ejb3</groupId> <artifactId>jboss-ejb3-ext-api</artifactId> <version>2.2.0.Final</version> </dependency>
管理 CLI を使用した配信アクティブの設定
管理 CLI を使用して、デプロイメント後に delivery-group
の active
属性を設定できます。これらの管理操作は、active
属性の値を動的に変更し、MDB の配信を有効または無効にします。Delivery Actgive の値を変更するこの方法は、サーバーを再起動しても維持されません。実行時に、管理するインスタンスに接続し、配信を管理する MDB のパスを入力します。例を以下に示します。
管理するインスタンスに移動します。
cd deployment=helloworld-mdb.war/subsystem=ejb3/message-driven-bean=HelloWorldQueueMDB
MDB への配信を停止するには、以下を行います。
:stop-delivery
MDB への配信を開始するには、以下を行います。
:start-delivery
MDB Delivery Active ステータスの表示
管理コンソールを使用して、MDB の現在の Delivery Active ステータスを表示できます。
- Runtime タブを選択し、該当するサーバーを選択します。
-
EJB をクリックし、
HelloWorldQueueMDB
などの子リソースを選択します。
結果
ステータスは Delivery Active: true
または Delivery Active: false
になります。
4.2.2. 配信グループ
配信グループは、MDB のグループの delivery-active
ステータスを管理する方法を提供します。MDB は、複数の 配信グループに所属できます。メッセージ配信は、MDB が属するすべての配信グループがアクティブの場合にのみ有効になります。クラスター化されたシングルトン MDB の場合、メッセージ配信は、MDB に関連付けられたすべての配信グループがアクティブである場合にのみ、クラスターのシングルトンノードでのみアクティブになります。
XML 設定または管理 CLI のいずれかを使用して ejb3
サブシステムに配信グループを追加できます。
jboss-ejb3.xml ファイルでの配信グループの設定
<delivery> <ejb-name>MdbName<ejb-name> <delivery-group>passive</delivery-group> </delivery>
サーバー側では、以下の例のように active
属性を true
に設定して delivery-groups
を有効にしたり、active
属性を false
に設定して無効にすることができます。
<delivery-groups> <delivery-group name="group" active="true"/> </delivery-groups>
管理 CLI を使用した配信グループの設定
delivery-groups
の状態は、管理 CLI を使用して更新できます。例を以下に示します。
/subsystem=ejb3/mdb-delivery-group=group:add /subsystem=ejb3/mdb-delivery-group=group:remove /subsystem=ejb3/mdb-delivery-group=group:write-attribute(name=active,value=true)
jboss-ejb3.xml
ファイルで Delivery Active を設定するか、アノテーションを使用すると、サーバーを再起動しても保持されます。ただし、管理 CLI を使用して配信を停止または開始すると、サーバーの再起動時に維持されません。
アノテーションを使用した複数の配信グループの設定
グループに属する各 MDB クラスで org.jboss.ejb3.annotation.DeliveryGroup
アノテーションを使用できます。
@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/HELLOWORLDMDBQueue"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") }) @DeliveryGroup("delivery-group-1") @DeliveryGroup("delivery-group-2") public class HelloWorldQueueMDB implements MessageListener { ... }
4.2.3. Clustered Singleton MDBs
MDB がクラスター化されたシングルトンとして識別され、クラスターにデプロイされると、単一のノードのみがアクティブになります。このノードは、メッセージを順次使用できます。サーバーノードが失敗すると、クラスター化されたシングルトン MDB からのアクティブなノードがメッセージを消費し始めます。
MDB をクラスター化されたシングルトンとして特定
以下のいずれかの手順を使用して、MDB をクラスター化シングルトンとして識別できます。
以下の例のように、clustered-singleton XML 要素を使用します。
<?xml version="1.1" encoding="UTF-8"?> <jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="urn:clustering:1.1" xmlns:d="urn:delivery-active:1.2" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1" impl-version="2.0"> <assembly-descriptor> <c:clustering> <ejb-name>HelloWorldQueueMDB</ejb-name> <c:clustered-singleton>true</c:clustered-singleton> </c:clustering> <d:delivery> <ejb-name>*</ejb-name> <d:group>delivery-group-1</d:group> <d:group>delivery-group-2</d:group> </d:delivery> </assembly-descriptor> </jboss:ejb-jar>
-
MDB クラスで
@org.jboss.ejb3.annotation.ClusteredSingleton
を使用します。この手順では、サーバーに追加の設定は必要ありません。クラスター環境でサービスを実行する必要があります。
singleton master
に選択されているクラスターノードがわからないため、クラスター全体 (具体的にはクラスターのすべてのノード) で delivery-group
を有効化する必要があります。サーバーが singleton master
となるノードを選択し、そのノードに必要な delivery-group
をアクティブにしていない場合、クラスター内のノードはメッセージを受信しません。
JBoss EAP に含まれる messaging-clustering-singleton
クイックスタートは、統合された Apache ActiveMQ Artemis でのクラスタリングの使用を示しています。これは helloworld-mdb
クイックスタートと同じソースコードを使用しますが、設定にのみ違いがあり、クラスター化されたシングルトンとして実行されます。このクイックスタートには、2 つの Jakarta Messaging リソースが含まれています。
-
Java Naming and Directory Interface にバインドされる
HELLOWORLDMDBQueue
という名前のキュー (java:/queue/HELLOWORLDMDBQueue)
-
Java Naming and Directory Interface を
java:/topic/HELLOWORLDMDBTopic
としてバインドするHELLOWORLDMDBTopic
という名前のトピック
いずれも jboss-ejb3.xml
ファイルで指定されるシングルトン設定を含みます。
<c:clustering> <ejb-name>*</ejb-name> <c:clustered-singleton>true</c:clustered-singleton> </c:clustering>
<ejb-name>
要素のワイルドカードアスタリスク *
は、アプリケーションに含まれるすべての MDB がクラスター化シングルトンであることを示しています。これにより、クラスター内の単一のノードのみが、特定の時点で MDB がアクティブになります。このアクティブなノードがシャットダウンすると、クラスター内の別のノードが MDB でアクティブなノードになり、シングルトンプロバイダーになります。
jboss-ejb3.xml
ファイルに、配信グループの設定を検索することもできます。
<d:delivery> <ejb-name>HelloWorldTopicMDB</ejb-name> <d:group>my-mdb-delivery-group</d:group> </d:delivery>
この場合、MDB のいずれかの HelloWorldTopicMDB
のみが配信グループに関連付けられます。MDB が使用するすべて配信グループは、ejb3
サブシステム設定で設定する必要があります。配信グループは有効または無効にできます。クラスターノードで配信グループが無効になっていると、その配信グループに属するすべての MDB が、対応するクラスターノードで非アクティブになります。非クラスター化環境で配信グループを使用する場合は、配信グループが有効になっているたびに MDB がアクティブになります。
配信グループがシングルトンプロバイダーとともに使用されている場合、そのノードで配信グループが有効になっている場合にのみ、MDB をシングルトンプロバイダーノードでアクティブにすることができます。それ以外の場合、MDB はそのノードで非アクティブになり、クラスターの他のすべてのノードは非アクティブになります。
メッセージングクラスタリング用にサーバーを設定する方法や、コード例を確認する方法については、このクイックスタートに含まれている README.html
ファイルを参照してください。
JBoss EAP クイックスタートのダウンロードおよび使用方法の詳細は、JBoss EAPJBoss EAP Getting Started Guideの Using the Quickstart Examples を参照してください。