4.12. 将过期的消息移到过期地址
对于最后一个值队列以外的队列,如果您只有非破坏性消费者,代理永远不会从队列中删除消息,从而导致队列大小随时间增加。要防止这种不受限制的队列大小增长,您可以在消息过期时配置,并指定代理将过期信息发送到的地址。
4.12.1. 配置消息到期 复制链接链接已复制到粘贴板!
以下流程演示了如何配置消息到期。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在
core
元素中,设置message-expiry-scan-period
以指定代理扫描过期消息的频率。<configuration ...> <core ...> ... <message-expiry-scan-period>1000</message-expiry-scan-period> ...
<configuration ...> <core ...> ... <message-expiry-scan-period>1000</message-expiry-scan-period> ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据前面的配置,代理每 1000 毫秒扫描一次过期的消息。
在
address-setting
元素中用于匹配地址 或一组 地址,指定到期地址。另外,设置消息过期时间。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow expiry-address
-
匹配地址或地址的到期地址。在前面的示例中,代理将
库存
地址的过期消息发送到名为ExpiryAddress
的过期地址。 expiry-delay
代理应用到 使用默认 过期时间的信息的过期时间(以毫秒为单位)。默认情况下,消息的过期时间为 0,这意味着它们没有过期。
对于大于默认值的过期时间的消息,
expiry-delay
无效。例如,假设您将地址上的
expiry-delay
设置为10
,如上例中所示。如果默认过期时间为0
的消息到达这个地址的队列,则代理会将消息的过期时间从0
改为10
。但是,如果使用20
过期时间的另一条消息,则其过期时间不会改变。如果将 expiry-delay 设为-1
,则禁用此功能。默认情况下,expiry-delay
设置为-1
。
另外,您可以指定最小和最大过期延迟值,而不是为
expiry-delay
指定一个值。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow min-expiry-delay
- 代理应用到消息的最小过期时间(以毫秒为单位)。
max-expiry-delay
代理应用到消息的最大过期时间(以毫秒为单位)。
代理应用
min-expiry-delay
和max-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-delay
和max-expiry-delay
值之间的过期消息,代理不会更改消息的过期时间。 -
如果您为
expiry-delay
指定一个值(即与默认值-1
不同的值),这将覆盖您为min-expiry-delay
和max-expiry-delay
指定的值。 -
min-expiry-delay
和max-expiry-delay
的默认值为
-1 (即 disabled)。
-
对于默认过期时间为
在配置文件的
addresses
元素中,配置之前为expiry-address
指定的地址。在此地址上定义一个队列。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前面的示例配置将到期队列
ExpiryQueue
与到期地址ExpiryAddress
关联。
4.12.2. 自动创建到期资源 复制链接链接已复制到粘贴板!
常见的用例是根据原始地址隔离过期的消息。例如,您可以选择将过期的消息从名为来自名为 stocks
的地址路由到一个名为 EXP.stocks
的过期队列。同样,您可以将过期的消息从名为 order
的地址路由到名为 EXP.orders
的过期队列。
这种类型的路由模式可以轻松地跟踪、检查和管理过期消息。但是,这种模式很难在使用主要自动创建的地址和队列的环境中实现。在这种环境中,管理员不希望手动创建地址和队列来保存过期消息所需的额外工作。
作为解决方案,您可以将代理配置为自动创建资源(即地址和队列)来处理给定地址 或一组 地址的过期消息。以下流程演示了一个示例。
先决条件
- 您已为给定地址 或一组 地址配置了到期地址。更多信息请参阅 第 4.12.1 节 “配置消息到期”。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 找到您之前添加到配置文件的 &
lt;address-setting
> 元素,以定义匹配地址 或一组 地址的到期地址。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 &
lt;address-setting
> 元素中,添加指示代理自动创建到期资源(即地址和队列)的配置项以及如何命名这些资源。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow auto-create-expiry-resources
指定代理是否自动创建到期地址和队列来接收过期的消息。默认值为
false
。如果参数值设置为
true
,代理会自动创建一个 <address>
; 元素来定义到期地址和关联的到期队列。自动创建的 <address> 元素的
name 值与为 指定的 name 值匹配<expiry-address>
。自动创建的过期队列有
multicast
路由类型。默认情况下,代理命名到期队列,以匹配最初发送过期消息的地址,如库存
。代理还为使用
_AMQ_ORIG_ADDRESS
属性的到期队列定义一个过滤器。此过滤器确保到期队列仅接收发送到相应原始地址的消息。expiry-queue-prefix
代理应用到自动创建过期队列的名称的前缀。默认值为
EXP。
当您定义前缀值或保留默认值时,到期队列的名称是前缀和原始地址(如
EXP.stocks
)的连接。expiry-queue-suffix
- 代理应用到自动创建的过期队列的名称的后缀。默认值没有定义(即,代理没有应用后缀)。
您可以自行使用队列名称(例如,使用 AMQ Broker Core Protocol JMS 客户端)或使用完全限定的队列名称(例如,使用另一个 JMS 客户端时)直接访问到期队列。
由于到期地址和队列会自动创建,与删除自动创建的地址和队列相关的所有地址设置也适用于这些到期资源。
其他资源
- 有关用于配置自动创建的地址和队列的地址设置的更多信息,请参阅 第 4.8.2 节 “配置自动创建和删除地址和队列”。