4.2. 消息驱动 Beans Controlled Delivery
JBoss EAP 提供三个属性来控制在特定 MDB 上主动接收消息:
4.2.1. delivery Active 复制链接链接已复制到粘贴板!
消息驱动型 Bean(MDB)的发送活动配置指示 MDB 是否在接收消息。如果 MDB 未接收消息,则消息将根据主题或队列规则保存在队列或主题中。
您可以使用 XML 或注释配置 delivery-group 的 active 属性,您可以在部署后使用管理 CLI 更改其值。默认情况下激活 active 属性,并在部署 MDB 后立即发送消息。
在 jboss-ejb3.xml 文件中配置交付活动
在 jboss-ejb3.xml 文件中,将 active 的 值设置为 false,以表示 MDB 在部署后不会立即收到消息:
如果要将活跃值应用到应用程序中的所有 MDB,您可以使用通配符 * 来代替 ejb-name。
使用注解配置交付活跃
您还可以使用 org.jboss.ejb3.annotation.DeliveryActive 注解。例如:
如果使用 Maven 构建项目,请确保在项目的 pom.xml 文件中添加以下依赖项:
<dependency>
<groupId>org.jboss.ejb3</groupId>
<artifactId>jboss-ejb3-ext-api</artifactId>
<version>2.2.0.Final</version>
</dependency>
<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 启用或禁用交付。如果重新启动服务器,这种更改交付活跃值的方法不会保留。在运行时,连接到您要管理的实例,然后输入您要管理的 MDB 的路径。例如:
进入您要管理的实例:
cd deployment=helloworld-mdb.war/subsystem=ejb3/message-driven-bean=HelloWorldQueueMDB
cd deployment=helloworld-mdb.war/subsystem=ejb3/message-driven-bean=HelloWorldQueueMDBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 停止发送到 MDB:
:stop-delivery
:stop-deliveryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 开始交付到 MDB:
:start-delivery
:start-deliveryCopy to Clipboard Copied! Toggle word wrap Toggle overflow
查看 MDB Delivery Active 状态
您可以使用管理控制台查看任何 MDB 的当前交付活跃状态:
- 选择 Runtime 选项卡,然后选择相应的服务器。
-
单击 EJB,再选择子资源,如
HelloWorldQueueMDB。
结果
您看到的状态为 Delivery Active: true 或 Delivery Active: false。
4.2.2. 交付组 复制链接链接已复制到粘贴板!
交付组提供了一种管理一组 MDB 的交付-主动 状态的方法。MDB 可以属于一个或多个交付组。只有 MDB 所属的所有交付组都处于活动状态时,才会启用消息发送。对于集群单例 MDB,消息发送仅在集群的单例节点中活跃,只有在与 MDB 关联的所有交付组都处于活动状态时。
您可以使用 XML 配置或管理 CLI 将交付组添加到 ejb3 子系统。
在 jboss-ejb3.xml 文件中配置 Delivery Group
<delivery> <ejb-name>MdbName<ejb-name> <delivery-group>passive</delivery-group> </delivery>
<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>
<delivery-groups>
<delivery-group name="group" active="true"/>
</delivery-groups>
使用管理 CLI 配置交付组
可以使用管理 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)
/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 文件中设置了活动的交付或使用注释时,它会在服务器重新启动时持久保留。但是,当使用管理 CLI 停止或启动交付时,它不会在服务器重启时持久保留。
使用注解配置多个交付组
您可以在属于某个组的每个 MDB 类上使用 org.jboss.ejb3.annotation.DeliveryGroup 注解:
4.2.3. 集群的单例 MDB 复制链接链接已复制到粘贴板!
当 MDB 被识别为集群单例并部署到集群中时,只有一个节点处于活跃状态。此节点可以按顺序使用消息。当服务器节点出现故障时,来自集群单例 MDB 的活动节点会开始使用消息。
将 MDB 识别为集群的单例
您可以使用以下步骤之一将 MDB 识别为集群单例。
使用 clustered-singleton XML 元素,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
在 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>
<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>
<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 入门 指南中的使用快速入门 示例 章节。