搜索

4.13. 将未发送的消息移到死信地址

download PDF

如果向客户端发送消息失败,您可能不希望代理持续尝试发送消息。为防止无限的尝试,您可以定义一个死信地址,以及一个或多个相关的死信队列。在进行指定数量的发送尝试后,代理会从其原始队列中删除未发送的消息,并将消息发送到配置的死信地址。系统管理员稍后可能会消耗从死信队列中未发送的消息来检查消息。

如果您没有为给定队列配置死信地址,代理会在指定次数发送尝试后从队列永久删除未发送的消息。

从死信队列使用未发送的消息具有以下属性:

_AMQ_ORIG_ADDRESS
指定消息的原始地址的字符串属性
_AMQ_ORIG_QUEUE
指定消息的原始队列的字符串属性

4.13.1. 配置死信地址

以下步骤演示了如何配置死信地址和关联的死信队列。

流程

  1. 打开 & lt;broker_instance_dir> /etc/broker.xml 配置文件。
  2. 在与您的队列名匹配的 < 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 ...>
    match
    代理在此 address-setting 部分中应用配置的地址。您可以为 < address-setting> 元素的 match 属性指定一个通配符表达式。如果您希望将 <address-setting> 项中配置的死信设置与一组地址相匹配,可以使用通配符表达式。
    dead-letter-address
    死信地址的名称。在本例中,代理将未发送的消息从队列 exampleQueue 移到死信地址 DLA
    max-delivery-attempts
    在将未发送的消息移到配置的死信地址前,代理发出的最大发送尝试次数。在本例中,代理会在 3 次失败发送尝试后将未发送的消息移到死信地址。默认值为 10。如果您希望代理进行无限的重新发送尝试数,请指定 -1 的值。
  3. addresses 部分中,为死信地址 DLA 添加一个 address 元素。要将死信队列与死信地址关联,请为 队列 指定 name 值。例如:

    <configuration ...>
       <core ...>
          ...
          <addresses>
             <address name="DLA">
                <anycast>
                   <queue name="DLQ" />
                </anycast>
             </address>
          ...
          </addresses>
       </core>
    </configuration>

在前面的配置中,您将名为 DLQ 的死信队列与死信地址 DLA 关联。

其他资源

4.13.2. 自动创建死信队列

常见用例是根据其原始地址隔离未发送的消息。例如,您可以选择将来自 stocks 的未被成功发送的消息路由到一个名为 DLA.stocks 的队列,它有一个相关的名为 DLQ.stocks 的死信队列。同样,您可以将未发送的消息从名为 orders 的地址路由到一个名为 DLA.orders的死信地址。

这种类型的路由模式可让您轻松跟踪、检查和管理未发送的消息。但是,很难在主要自动创建的地址和队列的环境中实施这种模式。系统管理员可能不希望手动创建地址和队列来保存未发送的消息所需的额外工作量。

作为解决方案,您可以将代理配置为自动创建地址和队列来处理未发送的消息,如以下步骤所示。

先决条件

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 找到您之前添加的 &lt ;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 ...>
  3. <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> 指定的 name 值匹配

    代理在自动创建的 <address> 元素 中定义的 死信队列具有 multicast 路由类型。默认情况下,代理将死信队列命名为死信队列,以匹配未 传输消息的原始地址,如库存

    代理还定义了使用 _AMQ_ORIG_ADDRESS 属性的死信队列的过滤器。此过滤器可确保死信队列仅接收发送到对应原始地址的消息。

    dead-letter-queue-prefix

    代理应用到自动创建的死信队列的名称的前缀。默认值为 DLQ。

    当您定义前缀值或保留默认值时,死信队列的名称是前缀和原始地址的串联,如 DLQ.stocks

    dead-letter-queue-suffix
    代理应用于自动创建的死信队列的后缀。默认值没有被定义(即,代理不会应用后缀)。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.