4.11. 配置最后的值队列
最后的值队列 是一种队列,当具有相同最后一个值 key 值的新消息放入队列中时,丢弃队列中的消息。通过此行为,最后一个值队列只保留同一键消息的最后一个值。
如果发送到队列的消息被分页,则 last-value 队列无法按预期工作。为具有最后一个值队列为 DROP
,BLOCK
或 FAIL
的地址设置 address-full-policy
参数的值,以确保发送到这些队列的消息不会被分页。如需更多信息,请参阅 第 7.2 节 “配置消息丢弃”。
最后一个值队列的简单用例是监控股票价格,其中只有特定库存的最新价值是值得关注的。
如果没有配置的最后一个值 key 的消息发送到最后一个值队列,代理会将此消息作为 "normal" 消息处理。当配置了最后一个值键到达的新消息时,此类消息不会从队列中清除。
您可以单独配置最后一个值队列,或为与一组地址关联的所有队列。
以下流程演示了如何以这些方式配置最后一个值队列。
4.11.1. 单独配置最后的值队列 复制链接链接已复制到粘贴板!
以下流程演示了如何单独配置最后一个值队列。
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 对于给定队列,添加
last-value-key
键并指定自定义值。例如:<address name="my.address"> <multicast> <queue name="prices1" last-value-key="stock_ticker"/> </multicast> </address>
<address name="my.address"> <multicast> <queue name="prices1" last-value-key="stock_ticker"/> </multicast> </address>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,您可以配置最后一个值队列,它使用默认值最后一个值键名称
_AMQ_LVQ_NAME
。为此,请将last-value
键添加到给定的队列中。将值设为true
。例如:<address name="my.address"> <multicast> <queue name="prices1" last-value="true"/> </multicast> </address>
<address name="my.address"> <multicast> <queue name="prices1" last-value="true"/> </multicast> </address>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.11.2. 为地址配置最后的值队列 复制链接链接已复制到粘贴板!
以下流程演示了如何为地址 或一组 地址配置最后的值队列。
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
address-setting
元素中,对于匹配地址,添加default-last-value-key
。指定一个自定义值。例如:<address-setting match="lastValue"> <default-last-value-key>stock_ticker</default-last-value-key> </address-setting>
<address-setting match="lastValue"> <default-last-value-key>stock_ticker</default-last-value-key> </address-setting>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据上述配置,与
lastValue
地址关联的所有队列都使用最后一个值键stock_ticker
。默认情况下,不会设置default-last-value-key
的值。要为 一组 地址配置最后的值队列,您可以指定一个地址通配符。例如:
<address-setting match="lastValue.*"> <default-last-value-key>stock_ticker</default-last-value-key> </address-setting>
<address-setting match="lastValue.*"> <default-last-value-key>stock_ticker</default-last-value-key> </address-setting>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,您可以将与地址 或一组 地址关联的所有队列配置为使用默认最后一个值键名称
_AMQ_LVQ_NAME
。要做到这一点,请添加default-last-value-queue
而不是default-last-value-key
。将值设为true
。例如:<address-setting match="lastValue"> <default-last-value-queue>true</default-last-value-queue> </address-setting>
<address-setting match="lastValue"> <default-last-value-queue>true</default-last-value-queue> </address-setting>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
- 有关配置地址时可以使用的通配符语法的更多信息,请参阅 第 4.2 节 “将地址设置应用到一组地址”。
4.11.3. 最后一个值队列行为示例 复制链接链接已复制到粘贴板!
本例显示了最后一个值队列的行为。
在 broker.xml
配置文件中,假设您添加了类似以下内容的配置:
<address name="my.address"> <multicast> <queue name="prices1" last-value-key="stock_ticker"/> </multicast> </address>
<address name="my.address">
<multicast>
<queue name="prices1" last-value-key="stock_ticker"/>
</multicast>
</address>
上述配置创建一个名为 prices1
的队列,其最后一个值为 stock_ticker
。
现在,假设客户端发送两个消息。每个信息对于属性 stock_ticker
有相同的 ATN
值。每个消息都有一个不同的值,用于名为 stock_price
的属性。每个消息都发送到同一队列 prices1
。
TextMessage message = session.createTextMessage("First message with last value property set"); message.setStringProperty("stock_ticker", "ATN"); message.setStringProperty("stock_price", "36.83"); producer.send(message);
TextMessage message = session.createTextMessage("First message with last value property set");
message.setStringProperty("stock_ticker", "ATN");
message.setStringProperty("stock_price", "36.83");
producer.send(message);
TextMessage message = session.createTextMessage("Second message with last value property set"); message.setStringProperty("stock_ticker", "ATN"); message.setStringProperty("stock_price", "37.02"); producer.send(message);
TextMessage message = session.createTextMessage("Second message with last value property set");
message.setStringProperty("stock_ticker", "ATN");
message.setStringProperty("stock_price", "37.02");
producer.send(message);
当有两个对于 stock_ticker
最后值键(这里是 ATN
)具有相同值的信息到达 prices1 queue
时,最有最后的信息会保留在队列中,第一个信息会被删除。在命令行中,您可以输入以下行来验证此行为:
TextMessage messageReceived = (TextMessage)messageConsumer.receive(5000); System.out.format("Received message: %s\n", messageReceived.getText());
TextMessage messageReceived = (TextMessage)messageConsumer.receive(5000);
System.out.format("Received message: %s\n", messageReceived.getText());
在本例中,您看到的输出是第二条消息,因为这两个消息对最后一个值键使用相同的值,并在第一个值后在队列中收到第二个消息。
4.11.4. 为最后的值队列强制使用非破坏性 复制链接链接已复制到粘贴板!
当消费者连接到队列时,通常的行为是发送到该消费者的消息由消费者专门获取。当消费者确认收到消息时,代理会从队列中删除消息。
作为正常消耗的替代方案,您可以将队列配置为强制实施 非破坏性 消耗。在这种情况下,当队列向消费者发送消息时,该消息仍然可以由其他使用者接收。此外,即使消费者已使用了该消息,消息也会保留在队列中。当您强制执行这种非破坏性消耗行为时,消费者被称为队列 浏览器。
强制非破坏性消耗是最后一个值队列的一个有用的配置,因为它可确保队列始终为特定最后的值键保存最新的值。
以下流程演示了如何为最后一个值队列强制实施非破坏性消耗。
先决条件
您已单独配置了最后一个值队列,或针对与地址 或一组 地址关联的所有队列。如需更多信息,请参阅:
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 如果您之前将队列配置为最后一个值队列,请添加
非破坏性
键。将值设为true
。例如:<address name="my.address"> <multicast> <queue name="orders1" last-value-key="stock_ticker" non-destructive="true" /> </multicast> </address>
<address name="my.address"> <multicast> <queue name="orders1" last-value-key="stock_ticker" non-destructive="true" /> </multicast> </address>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您之前为最后一个值队列配置了地址 或一组 地址,请添加
default-non-destructive
键。将值设为true
。例如:<address-setting match="lastValue"> <default-last-value-key>stock_ticker </default-last-value-key> <default-non-destructive>true</default-non-destructive> </address-setting>
<address-setting match="lastValue"> <default-last-value-key>stock_ticker </default-last-value-key> <default-non-destructive>true</default-non-destructive> </address-setting>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意默认情况下,
default-non-destructive
的值为false
。