当消费者连接到队列时,正常行为是将发送给该消费者的消息专属于该消费者,并且当消费者确认它们时,消息将从队列中删除。

另一种常见模式是拥有队列“浏览器”,它们将所有消息发送到浏览器,但不会阻止其他消费者接收消息,也不会在浏览器完成处理后将它们从队列中删除。这种浏览器是“非破坏性”消费者的一个实例。

如果队列上的每个消费者都是非破坏性的,那么我们可以获得一些有趣的行为。在最后值队列的情况下,队列将始终包含每个键的最新值。

可以使用以下队列配置创建队列以强制所有消费者是非破坏性的

<address name="foo.bar">
   <multicast>
      <queue name="orders1" non-destructive="true" />
   </multicast>
</address>

或者在使用 JMS 客户端进行自动创建时,通过在消费者使用的目标创建时使用地址参数。

Queue queue = session.createQueue("my.destination.name?non-destructive=true");
Topic topic = session.createTopic("my.destination.name?non-destructive=true");

此外,可以使用 address-setting 配置对地址下所有队列的默认值进行设置

<address-setting match="nonDestructiveQueue">
   <default-non-destructive>true</default-non-destructive>
</address-setting>

默认情况下,default-non-destructivefalse

1. 限制队列大小

对于除最后值队列之外的队列,只有非破坏性消费者可能意味着消息永远不会被删除,导致队列不受限制地增长。为了防止这种情况,您可以使用设置默认 expiry-delay 的功能。有关此功能的更多详细信息,请参阅expiry-delay。您也可以使用环形队列