4.2.3. 集群的单例 MDB

当 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。此过程不需要额外的服务器配置。您需要在集群环境中运行该服务。
注意

您必须激活整个集群中的 delivery-group,特别是集群中的所有节点,因为您不知道哪个集群的节点被选为 单例 master。如果服务器选择要成为 单例 master 的节点,并且该节点没有激活所需的 delivery-group,则集群中没有节点接收消息。

JBoss EAP 随附 的 messaging-clustering-singleton 快速入门演示了如何将集群与 Apache ActiveMQ Artemis 集成使用。它使用与 helloworld-mdb 快速启动相同的源代码,只有配置有差别才能将它作为集群单例运行。此快速入门中包含两种 Jakarta 消息传递资源:

  • 在 Java 命名和目录接口中绑定名为 HELLOWORLDMDBQueue 的 队列,作为 java:/queue/HELLOWORLDMDBQueue
  • Java 命名和目录界面中名为 HELLOWORLDMDBTopic 的主题,作为 java:/topic/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 与交付组关联。必须在 ejb3 子系统配置中配置 MDB 使用的所有交付组。可以启用或禁用交付组。如果在集群节点中禁用了交付组,属于该交付组的所有 MDB 分别在相应的群集节点中不可用。在非集群环境中使用交付组时,每当启用交付组时 MDB 就会活跃。

如果交付组与单例提供程序结合使用,只有在该节点启用了交付组时,MDB 才能在单例供应商节点中处于活动状态。否则,MDB 将在那个节点中不活跃,以及集群中的所有其他节点。

有关如何为消息传递集群配置服务器并查看代码示例,请参阅此快速入门中包含的 README.html 文件。

有关如何下载和使用 JBoss EAP 快速入门的信息,请参见 JBoss EAP 入门 指南中的使用快速入门 示例 章节。