4.2. メッセージ駆動 Bean が制御する配信

JBoss EAP は、特定の MDB でメッセージのアクティブな受信を制御する以下の属性を提供します。

4.2.1. Delivery Active

メッセージ駆動 Bean (MDB) の配信アクティブ (Delivery Active) 設定は、MDB がメッセージを受信しているかどうかを示します。MDB がメッセージを受信していない場合、メッセージはトピックまたはキューのルールに従ってキューまたはトピックに保存されます。

XML またはアノテーションを使用して delivery-groupactive 属性を設定できます。また、管理 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-groupactive 属性を設定できます。これらの管理操作は、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 ステータスを表示できます。

  1. Runtime タブを選択し、該当するサーバーを選択します。
  2. 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 GuideUsing the Quickstart Examples を参照してください。