4.13. 将未接收的消息移动到死信地址
如果向客户端发送一条消息失败,您可能不希望代理进行持续尝试传递消息。为防止有限发送尝试,您可以定义 死信地址,以及一个或多个 asscociated dead letter Queue。在指定的发送尝试次数后,代理会从其原始队列中删除未发送的消息,并将消息发送到配置的死信地址。系统管理员可以在以后消耗来自死信队列的未发送的消息来检查消息。
如果您没有为给定队列配置死信地址,代理会在指定数量的传输尝试后永久从队列中删除未接收的消息。
从死信队列消耗的消息取消接收以下属性:
_AMQ_ORIG_ADDRESS
- 指定消息的原始地址的字符串属性
_AMQ_ORIG_QUEUE
- 指定消息的原始队列的字符串属性
4.13.1. 配置死信地址
以下步骤演示了如何配置死信地址和关联的死信队列。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在与队列名称匹配的 <
address-setting
> 元素中,为死信地址名称设置值以及传输尝试的最大数量。例如:<configuration ...> <core ...> ... <address-settings> ... <address-setting match="exampleQueue"> <dead-letter-address>DLA</dead-letter-address> <max-delivery-attempts>3</max-delivery-attempts> </address-setting> ... <address-settings> <configuration ...>
匹配
-
代理在此
address-setting
部分中应用配置的地址。您可以为 <address-setting
> 元素的match
属性指定一个通配符表达式。如果要将 <address-setting
> 元素中配置的死信>元素 与一组 匹配的地址关联,可使用通配符表达式。 dead-letter-address
- 死信地址的名称。在本例中,代理将来自队列 示例Queue 的消息移到 dead letter 地址 DLA。
max-delivery-attempts
-
代理在将未发送的消息移动到配置的死信地址之前,代理进行的最大交付尝试数。在本例中,代理会在 3 次失败发送尝试后将未发送的消息移到死信地址。默认值为
10
。如果您希望代理进行无限次重新发送尝试,请指定-1
值。
在
address
部分中,为死信地址
DLA 添加地址元素。要将死信队列与死信地址关联,请为队列
指定 name 值。例如:<configuration ...> <core ...> ... <addresses> <address name="DLA"> <anycast> <queue name="DLQ" /> </anycast> </address> ... </addresses> </core> </configuration>
在上述配置中,您要将名为 DLQ 的死信队列与死信地址 DLA 关联。
其他资源
- 有关在地址设置中使用通配符的详情请参考 第 4.2 节 “将地址设置应用到一组地址”。
4.13.2. 自动创建死信队列
常见的用例是根据原始地址隔离未传输的消息。例如,您可以选择将名为 stocks
的地址的未传输消息路由到名为 DLA.stocks
的死信队列,该队列名为 DLQ.stocks
。同样,您可以将未发送的消息从名为 orders
的地址路由到一个名为 DLA.orders
的死信地址。
这种路由模式有助于轻松跟踪、检查和管理实时消息。但是,很难在主要使用自动创建的地址和队列的环境中实现这种模式。这种类型的环境的系统管理员可能不希望进行手动创建地址和队列所需的额外工作来保存未发送的消息。
作为解决方案,您可以将代理配置为自动创建寻址和队列来处理未传输的消息,如以下步骤所示。
先决条件
- 您已为队列或一组队列配置了死信地址。更多信息请参阅 第 4.13.1 节 “配置死信地址”。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 找到您之前添加的 <
;address-setting
> 元素,以定义匹配队列或一组队列的死信地址。例如:<configuration ...> <core ...> ... <address-settings> ... <address-setting match="exampleQueue"> <dead-letter-address>DLA</dead-letter-address> <max-delivery-attempts>3</max-delivery-attempts> </address-setting> ... <address-settings> <configuration ...>
在
<address-setting
> 元素中,添加配置项来指示代理自动创建死信资源(即地址和队列),以及如何命名这些资源。例如:<configuration ...> <core ...> ... <address-settings> ... <address-setting match="exampleQueue"> <dead-letter-address>DLA</dead-letter-address> <max-delivery-attempts>3</max-delivery-attempts> <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources> <dead-letter-queue-prefix>DLQ.</dead-letter-queue-prefix> <dead-letter-queue-suffix></dead-letter-queue-suffix> </address-setting> ... <address-settings> <configuration ...>
auto-create-dead-letter-resources
指定代理是否自动创建死信地址和队列来接收未传输的消息。默认值为
false
。如果将
auto-create-dead-letter-resources
设为true
,则代理会自动创建一个 <address
> 元素来定义死信地址和关联的死信队列。自动创建的 <address>
元素的名称与您为 <dead-letter-address> 指定的名称值匹配
。代理在自动创建的 <address> 元素
中定义的
死信队列具有多播路由
类型。默认情况下,代理将死信队列名称以匹配未发送的消息的原始地址,如stocks
。代理还会为使用
_AMQ_ORIG_ADDRESS
属性的死信队列定义过滤器。此过滤器确保死信队列仅接收发送到对应原始地址的消息。dead-letter-queue-prefix
代理应用到自动创建死信队列的名称前缀。默认值为
DLQ。
当您定义前缀值或保留默认值时,死信队列的名称是前缀的串联和原始地址,如
DLQ.stocks
。dead-letter-queue-suffix
- 代理应用到自动创建的死信队列的后缀。默认值没有被定义(即代理不会应用后缀)。