第 11 章 消息组
消息组是有以下特征的一组消息:
-
消息组中的消息共享相同的组 ID,即它们具有相同的组标识符属性。对于 JMS 消息,属性是
JMSXGroupID
。 - 消息组中的消息始终由同一消费者使用,即使队列中有多个使用者也是如此。如果原始消费者关闭,选择另一消费者接收消息组。
当您希望对某个属性值的所有消息由同一消费者按顺序处理时,消息组很有用。例如,您可能希望订购任何特定的库存购买,以便由相同的消费者按顺序处理。为此,您可以创建使用者池,然后将库存名称设置为 message 属性的值。这样可确保特定库存的所有消息始终由同一消费者处理。
分组的消息可能会影响队列的底层 FIFO 语义的并发处理非组消息。例如,如果队列头有 100 个组消息的块,并且后接 1,000 个非组消息,则所有分组的消息都将发送到适当的客户端,然后再使用任何非组的消息。这种情况下的功能影响是并发消息处理的临时挂起,同时处理所有分组的消息。在确定您的消息组大小时,请记住这种潜在的性能瓶颈。考虑是否要将分组的消息与您的非组消息隔离。
11.1. 客户端消息组
以下示例演示了如何使用核心 JMS 客户端的消息分组。
步骤
设置组 ID。
如果您使用 JNDI 为 JMS 客户端建立 JMS 连接工厂,请添加
groupID
参数并提供一个值。使用此连接工厂发送的所有消息都将属性JMSXGroupID
设置为指定的值。java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?groupID=MyGroup
如果您不使用 JNDI,请使用
setStringProperty()
方法设置JMSXGroupID
属性。Message message = new TextMessage(); message.setStringProperty("JMSXGroupID", "MyGroup"); producer.send(message);
相关信息
请参阅 INSTALL_DIR/examples/features/standard
下的 mesagge-group
和 message-group2
,以了解如何配置和使用消息组的示例。