4.11. 配置最后一个值队列


最后一个值队列 是一种队列类型,当将具有相同最后值键值的较新的消息放入队列中时,丢弃队列中的消息。通过此行为,最后一个值队列只为同一键的消息保留最后一个值。

注意

如果发送到队列的消息被分页,则 last-value 队列无法按预期工作。为具有最后一个值队列为 DROP,BLOCKFAIL 的地址设置 address-full-policy 参数的值,以确保发送到这些队列的消息不会被分页。如需更多信息,请参阅 第 7.2 节 “配置消息丢弃”

最后一个值队列的简单用例是监控股票价格,其中只有特定库存的最新价值值得关注。

注意

如果没有配置的最后值键的消息被发送到最后一个值队列,代理会将这个消息作为 "normal" 信息处理。当带有配置的最后一个值键的新消息到达时,此类消息不会从队列中清除。

您可以单独配置最后一个值队列,或配置与一组地址关联的所有队列。

以下流程演示了如何以这些方式配置最后的值队列。

4.11.1. 单独配置最后一个值队列

以下流程演示了如何单独配置最后的值队列。

  1. 打开 & lt;broker_instance_dir> /etc/broker.xml 配置文件。
  2. 对于给定队列,添加 last-value-key 键并指定自定义值。例如:

    <address name="my.address">
        <multicast>
            <queue name="prices1" last-value-key="stock_ticker"/>
        </multicast>
    </address>
  3. 或者,您可以配置使用默认值最后的值键名称 _AMQ_LVQ_NAME 的最后一个值队列。为此,请将 last-value 键添加到给定的队列中。将值设为 true。例如:

    <address name="my.address">
        <multicast>
            <queue name="prices1" last-value="true"/>
        </multicast>
    </address>

4.11.2. 为地址配置最后一个值队列

以下流程演示了如何为地址 或一组 地址配置最后的值队列。

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. address-setting 元素中,用于匹配地址,添加 default-last-value-key。指定自定义值。例如:

    <address-setting match="lastValue">
       <default-last-value-key>stock_ticker</default-last-value-key>
    </address-setting>

    根据上述配置,与 lastValue 地址关联的所有队列都使用 stock_ticker 的最后值。默认情况下,不设置 default-last-value-key 的值。

  3. 要为 一组 地址配置最后的值队列,您可以指定地址通配符。例如:

    <address-setting match="lastValue.*">
       <default-last-value-key>stock_ticker</default-last-value-key>
    </address-setting>
  4. 或者,您可以将与地址或地址 关联的所有队列配置为使用默认值 _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>

其他资源

4.11.3. 最后值队列行为示例

本例显示了最后的值队列的行为。

broker.xml 配置文件中,假设您添加了类似于以下内容的配置:

<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("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());

在本例中,您看到的输出是第二个消息,因为两个消息都使用最后一个值键的相同值,并且第一个后在队列中收到第二个消息。

4.11.4. 为最后一个值队列强制使用非破坏性消耗

当消费者连接到队列时,发送到该消费者的正常行为会被消费者单独获取。当消费者确认接收消息时,代理会从队列中删除消息。

作为常规消耗的替代选择,您可以将队列配置为强制实施 非破坏性 消耗。在这种情况下,当队列向消费者发送消息时,其他消费者仍然可以接收该消息。此外,即使消费者消耗了它,消息也会保留在队列中。当您强制这种非破坏性消耗行为时,用户被称为队列 浏览器

强制非破坏性消耗是最后一个值队列的有用配置,因为它可确保队列始终包含特定最后的值键的最新值。

以下流程演示了如何对最后一个值队列强制使用非破坏性。

先决条件

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 如果您之前将队列单独配置为最后一个值队列,请添加 非破坏性 键。将值设为 true。例如:

    <address name="my.address">
       <multicast>
          <queue name="orders1" last-value-key="stock_ticker" non-destructive="true" />
       </multicast>
    </address>
  3. 如果您之前为最后一个值队列配置了地址 或一组 地址,请添加 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>
    注意

    默认情况下,default-non-destructive 的值为 false

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.