4.12. 将过期的消息移到到期地址
对于最后一个值队列以外的队列,如果您只有一个非破坏性消费者,代理永远不会从队列中删除消息,从而导致队列大小随着时间增大。为防止这种队列大小不受约束的增长,您可以配置消息过期的时间并指定代理向其移动过期消息的地址。
4.12.1. 配置消息过期
以下流程演示了如何配置消息到期。
流程
-
打开
<broker_instance_dir>/etc/broker.xml
配置文件。 在
core
元素中,设置message-expiry-scan-period
,以指定代理扫描过期消息的频率。<configuration ...> <core ...> ... <message-expiry-scan-period>1000</message-expiry-scan-period> ...
根据上述配置,代理每隔 1000 毫秒扫描过期的消息队列。
在匹配地址的
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 ...>
expiry-address
-
匹配地址的到期地址。在前面的示例中,代理会向名为
ExpiryAddress
的
到期地址发送过期的消息。 expiry-delay
代理应用到 使用默认 过期时间的消息,以毫秒为单位。默认情况下,消息的过期时间为
0
,即它们不会过期。对于过期时间大于默认的消息,expiration-delay
无效。例如,假设您将地址上的
expiration-delay
设置为10
,如上例中所示。如果默认过期时间为0
的消息在此地址到达队列,代理会将消息的过期时间从0 更改为
10
。但是,如果另一条消息使用过期时间20
到达,则其过期时间保持不变。如果将 expiration-delay 设置为-1
,则此功能被禁用。默认情况下,expiry-delay
设置为-1
。
另外,您可以指定最小和最大
到期延迟值,而不是为 expiration-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 ...>
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
之间带有 expiration 的消息, -
如果您为
expiry-delay
指定一个值(即默认值-1
以外的值),这将覆盖您为min-expiry-delay 和
指定的任何值。max-expir
y-delay -
min-expiry-delay 和
的默认值都是max-
expiry-delay-1
(即禁用)。
-
对于默认过期时间为
在 配置文件的 address 元素中,配置之前为 expiration
-address
指定的地址
。在此地址上定义队列.例如:<addresses> ... <address name="ExpiryAddress"> <anycast> <queue name="ExpiryQueue"/> </anycast> </address> ... </addresses>
以上示例配置将到期队列
ExpiryQueue
与到期地址ExpiryAddress
关联。