4.12. 将过期的消息移到过期地址


对于最后一个值队列以外的队列,如果您只有非破坏性消费者,代理永远不会从队列中删除消息,从而导致队列大小随时间增加。要防止这种不受限制的队列大小增长,您可以在消息过期时配置,并指定代理将过期信息发送到的地址。

4.12.1. 配置消息到期

以下流程演示了如何配置消息到期。

流程

  1. 打开 & lt;broker_instance_dir> /etc/broker.xml 配置文件。
  2. core 元素中,设置 message-expiry-scan-period 以指定代理扫描过期消息的频率。

    <configuration ...>
       <core ...>
          ...
          <message-expiry-scan-period>1000</message-expiry-scan-period>
          ...
    Copy to Clipboard Toggle word wrap

    根据前面的配置,代理每 1000 毫秒扫描一次过期的消息。

  3. address-setting 元素中用于匹配地址 或一组 地址,指定到期地址。另外,设置消息过期时间。例如:

    <configuration ...>
       <core ...>
          ...
          <address-settings>
             ...
             <address-setting match="stocks">
                ...
                <expiry-address>ExpiryAddress</expiry-address>
                <expiry-delay>10</expiry-delay>
                ...
             </address-setting>
             ...
          <address-settings>
    <configuration ...>
    Copy to Clipboard Toggle word wrap
    expiry-address
    匹配地址或地址的到期地址。在前面的示例中,代理将 库存 地址的过期消息发送到名为 ExpiryAddress 的过期地址。
    expiry-delay

    代理应用到 使用默认 过期时间的信息的过期时间(以毫秒为单位)。默认情况下,消息的过期时间为 0,这意味着它们没有过期。对于大于默认值的过期时间的消息,expiry-delay 无效。

    例如,假设您将地址上的 expiry-delay 设置为 10,如上例中所示。如果默认过期时间为 0 的消息到达这个地址的队列,则代理会将消息的过期时间从 0 改为 10。但是,如果使用 20 过期时间的另一条消息,则其过期时间不会改变。如果将 expiry-delay 设为 -1,则禁用此功能。默认情况下,expiry-delay 设置为 -1

  4. 另外,您可以指定最小和最大过期延迟值,而不是为 expiry-delay 指定一个值。例如:

    <configuration ...>
       <core ...>
          ...
          <address-settings>
             ...
             <address-setting match="stocks">
                ...
                <expiry-address>ExpiryAddress</expiry-address>
                <min-expiry-delay>10</min-expiry-delay>
                <max-expiry-delay>100</max-expiry-delay>
                ...
             </address-setting>
             ...
          <address-settings>
    <configuration ...>
    Copy to Clipboard Toggle word wrap
    min-expiry-delay
    代理应用到消息的最小过期时间(以毫秒为单位)。
    max-expiry-delay

    代理应用到消息的最大过期时间(以毫秒为单位)。

    代理应用 min-expiry-delaymax-expiry-delay 的值,如下所示:

    • 对于默认过期时间为 0 的信息,代理会将过期时间设置为指定的值 max-expiry-delay。如果您还没有为 max-expiry-delay 指定一个值,代理会将过期时间设置为 min-expiry-delay 的指定的值。如果您还没有为 min-expiry-delay 指定一个值,代理不会更改消息的过期时间。
    • 对于超过 max-expiry-delay 的值的过期时间,代理会将过期时间设置为指定的值 max-expiry-delay
    • 对于低于 min-expiry-delay 值的过期时间,代理会将过期时间设置为指定的 min-expiry-delay 值。
    • 对于带有 min-expiry-delaymax-expiry-delay 值之间的过期消息,代理不会更改消息的过期时间。
    • 如果您为 expiry-delay 指定一个值(即与默认值 -1 不同的值),这将覆盖您为 min-expiry-delaymax-expiry-delay 指定的值。
    • min-expiry-delaymax-expiry-delay 的默认值为 -1 (即 disabled)。
  5. 在配置文件的 addresses 元素中,配置之前为 expiry-address 指定的地址。在此地址上定义一个队列。例如:

    <addresses>
        ...
        <address name="ExpiryAddress">
            <anycast>
                <queue name="ExpiryQueue"/>
            </anycast>
        </address>
        ...
    </addresses>
    Copy to Clipboard Toggle word wrap

    前面的示例配置将到期队列 ExpiryQueue 与到期地址 ExpiryAddress 关联。

4.12.2. 自动创建到期资源

常见的用例是根据原始地址隔离过期的消息。例如,您可以选择将过期的消息从名为来自名为 stocks 的地址路由到一个名为 EXP.stocks 的过期队列。同样,您可以将过期的消息从名为 order 的地址路由到名为 EXP.orders 的过期队列。

这种类型的路由模式可以轻松地跟踪、检查和管理过期消息。但是,这种模式很难在使用主要自动创建的地址和队列的环境中实现。在这种环境中,管理员不希望手动创建地址和队列来保存过期消息所需的额外工作。

作为解决方案,您可以将代理配置为自动创建资源(即地址和队列)来处理给定地址 或一组 地址的过期消息。以下流程演示了一个示例。

先决条件

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 找到您之前添加到配置文件的 & lt;address-setting > 元素,以定义匹配地址 或一组 地址的到期地址。例如:

    <configuration ...>
    
       <core ...>
          ...
          <address-settings>
             ...
             <address-setting match="stocks">
                ...
                <expiry-address>ExpiryAddress</expiry-address>
                ...
             </address-setting>
             ...
          <address-settings>
    <configuration ...>
    Copy to Clipboard Toggle word wrap
  3. 在 & lt;address-setting > 元素中,添加指示代理自动创建到期资源(即地址和队列)的配置项以及如何命名这些资源。例如:

    <configuration ...>
       <core ...>
          ...
          <address-settings>
             ...
             <address-setting match="stocks">
                ...
                <expiry-address>ExpiryAddress</expiry-address>
                <auto-create-expiry-resources>true</auto-create-expiry-resources>
                <expiry-queue-prefix>EXP.</expiry-queue-prefix>
                <expiry-queue-suffix></expiry-queue-suffix>
                ...
             </address-setting>
             ...
          <address-settings>
    <configuration ...>
    Copy to Clipboard Toggle word wrap
    auto-create-expiry-resources

    指定代理是否自动创建到期地址和队列来接收过期的消息。默认值为 false

    如果参数值设置为 true,代理会自动创建一个 <address &gt; 元素来定义到期地址和关联的到期队列。自动创建的 <address&gt ; 元素的 name 值与为 指定的 name 值匹配 <expiry-address>

    自动创建的过期队列有 multicast 路由类型。默认情况下,代理命名到期队列,以匹配最初发送过期消息的地址,如 库存

    代理还为使用 _AMQ_ORIG_ADDRESS 属性的到期队列定义一个过滤器。此过滤器确保到期队列仅接收发送到相应原始地址的消息。

    expiry-queue-prefix

    代理应用到自动创建过期队列的名称的前缀。默认值为 EXP。

    当您定义前缀值或保留默认值时,到期队列的名称是前缀和原始地址(如 EXP.stocks )的连接。

    expiry-queue-suffix
    代理应用到自动创建的过期队列的名称的后缀。默认值没有定义(即,代理没有应用后缀)。

您可以自行使用队列名称(例如,使用 AMQ Broker Core Protocol JMS 客户端)或使用完全限定的队列名称(例如,使用另一个 JMS 客户端时)直接访问到期队列。

注意

由于到期地址和队列会自动创建,与删除自动创建的地址和队列相关的所有地址设置也适用于这些到期资源。

其他资源

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部