从入门到上线:Spring Boot中实现RabbitMQ死信队列的完整路径,少走3年弯路

第一章:Spring Boot中RabbitMQ死信队列的核心概念

在构建高可靠性的消息系统时,死信队列(Dead Letter Queue, DLQ)是处理异常消息的重要机制。当消息在队列中无法被正常消费时,例如因超时、拒绝或达到最大重试次数,RabbitMQ 可将其自动转发至预定义的死信交换机,最终进入死信队列,避免消息丢失并便于后续排查。

死信的产生条件

  • 消息被消费者显式拒绝(basic.reject 或 basic.nack)且未设置重回队列
  • 消息在队列中的存活时间超过 TTL(Time-To-Live)
  • 队列达到最大长度限制,导致新消息无法入队

死信队列的配置方式

在 Spring Boot 中,需通过声明队列参数来绑定死信交换机和路由键。以下是一个典型配置示例:
// 声明业务队列,并指定死信交换机
@Bean
public Queue orderQueue() {
    return QueueBuilder.durable("order.queue")
        .withArgument("x-dead-letter-exchange", "dlx.exchange") // 指定死信交换机
        .withArgument("x-dead-letter-routing-key", "order.dlq") // 转发到死信队列的 routing key
        .withArgument("x-message-ttl", 10000) // 消息10秒未被消费则过期
        .build();
}

// 声明死信队列
@Bean
public Queue deadLetterQueue() {
    return new Queue("order.dlq");
}
上述代码中,x-dead-letter-exchange 参数指定消息变为死信后应发送到的交换机,而 x-dead-letter-routing-key 控制其路由路径。

死信流转流程图

graph LR A[生产者] -->|发送消息| B(业务队列) B -->|TTL过期/拒绝消费| C{是否满足死信条件?} C -->|是| D[死信交换机] D -->|按routing key| E[死信队列] E --> F[死信消费者]
属性名说明
x-dead-letter-exchange指定死信消息转发的目标交换机
x-dead-letter-routing-key指定死信消息的路由键,若未设置则使用原消息的 routing key
x-message-ttl消息在队列中的最大存活时间(毫秒)

第二章:RabbitMQ基础与死信机制原理

2.1 RabbitMQ消息模型与交换机类型

RabbitMQ 核心基于消息生产者、交换机、队列和消费者构成的消息流转模型。消息由生产者发送至交换机,交换机根据类型和绑定规则将消息路由到相应队列。
常见的交换机类型
  • Direct:精确匹配路由键,适用于点对点通信。
  • Topic:支持通配符匹配(如 *.error),适合事件通知系统。
  • Fanout:广播模式,向所有绑定队列发送消息。
  • Headers:基于消息头属性进行匹配,灵活性高但使用较少。
代码示例:声明 Topic 交换机
channel.exchange_declare(exchange='logs_topic',
                         exchange_type='topic')
channel.queue_declare(queue='errors_queue')
channel.queue_bind(exchange='logs_topic',
                   queue='errors_queue',
                   routing_key='*.error')
上述代码创建一个名为 logs_topic 的 topic 类型交换机,并将队列绑定到以 .error 结尾的路由键,实现日志级别的过滤消费。

2.2 死信的产生条件与路由流程

当消息在队列中无法被正常消费时,会进入死信状态。常见触发条件包括:消息被消费者拒绝(NACK)且未设置重回队列、消息过期、队列达到最大长度限制。
死信产生的三大条件
  • 消息被消费者显式拒绝(basic.rejectbasic.nack)并设置 requeue=false
  • 消息存活时间超过 TTL(Time-To-Live)
  • 队列达到最大长度或内存限制,导致最早的消息被丢弃
死信路由流程
一旦满足上述任一条件,Broker 将消息重新发布到预设的死信交换机(Dead Letter Exchange, DLX),由其根据绑定规则转发至死信队列(DLQ),便于后续排查。
channel.QueueDeclare(
    "my-queue",
    false,
    false,
    false,
    false,
    amqp.Table{
        "x-dead-letter-exchange":    "dlx.exchange", // 指定死信交换机
        "x-message-ttl":             60000,          // 消息过期时间
        "x-max-length":              1000,
    },
)
上述代码声明了一个普通队列,并配置了死信交换机和消息过期策略。当消息在该队列中触发死信条件时,将自动路由至 dlx.exchange 进行后续处理。

2.3 TTL、队列长度限制与消息拒绝的关系

在消息队列系统中,TTL(Time-To-Live)、队列长度限制与消费者的消息拒绝行为共同决定了系统的可靠性与负载控制能力。
消息过期与TTL机制
每条消息可设置TTL,超过该时间未被消费则自动失效。例如在RabbitMQ中:

{
  "expiration": "60000",
  "body": "order_created_event"
}
此配置表示消息在队列中最多存活60秒。TTL防止消息无限堆积,提升资源利用率。
队列长度限制与溢出策略
当队列达到预设长度上限时,系统需决策如何处理新消息。常见策略包括丢弃旧消息或拒绝新消息。
策略行为
reject-new拒绝新消息,返回错误
drop-oldest丢弃队列头部最老消息
消息拒绝的连锁影响
消费者显式拒绝消息(如NACK)且不重新入队时,若配合TTL和长度限制,可能触发消息丢失或服务降级。因此三者需协同配置,确保系统在高负载下仍可控。

2.4 死信队列的设计模式与典型应用场景

死信队列(Dead Letter Queue, DLQ)是一种处理消息失败的补偿机制,用于存储无法被正常消费的消息。当消息消费失败达到最大重试次数或因格式错误、系统异常等原因无法处理时,将其转移到死信队列中,避免阻塞主消息流。
设计模式
常见的实现模式包括独立队列模式和绑定路由模式。在 RabbitMQ 中,可通过设置 `x-dead-letter-exchange` 属性指定死信转发规则。

{
  "queue": "main_queue",
  "arguments": {
    "x-dead-letter-exchange": "dlx.exchange",
    "x-dead-letter-routing-key": "dlq.routing.key"
  }
}
上述配置表示当消息被拒绝或过期后,将自动发布到指定的死信交换器,并由路由键投递至死信队列,便于后续排查与重放。
典型应用场景
  • 异步任务处理中的异常隔离
  • 数据校验失败的消息暂存
  • 跨系统集成时的容错保障
通过死信队列可有效提升系统的健壮性与可观测性。

2.5 Spring Boot集成RabbitMQ的基础配置实践

在Spring Boot项目中集成RabbitMQ,首先需引入spring-boot-starter-amqp依赖,启用AMQP协议支持。通过配置文件定义连接参数,实现与消息中间件的通信。
添加Maven依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
该依赖自动装配RabbitTemplate和SimpleMessageListenerContainer,简化开发流程。
配置application.yml
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /
参数说明:host为RabbitMQ服务地址,port为AMQP端口,virtual-host用于逻辑隔离。确保服务已启动并可远程访问。 通过Java配置类声明队列、交换机及绑定关系,实现解耦通信。后续可扩展为动态路由或延迟消息机制。

第三章:死信队列的实现与配置

3.1 声明普通队列及其死信绑定关系

在 RabbitMQ 中,普通队列可通过设置特定参数来绑定死信交换器(Dead Letter Exchange, DLX),实现消息异常流转处理。
队列声明与死信参数配置
通过以下代码声明一个具备死信路由功能的普通队列:
args := amqp.Table{
    "x-dead-letter-exchange":    "dlx.exchange",
    "x-dead-letter-routing-key": "dlx.routing.key",
    "x-message-ttl":             60000,
}
channel.QueueDeclare(
    "normal_queue",
    true, false, false, false,
    args,
)
上述参数中,x-dead-letter-exchange 指定死信应转发至的交换器,x-dead-letter-routing-key 定义转发时使用的路由键,而 x-message-ttl 可触发因超时进入死信流程。
死信流转机制
当消息在普通队列中被拒绝(Nack)、过期或队列满时,将自动发布到指定死信交换器,由其按路由规则投递至死信队列,便于后续分析与重试。

3.2 配置TTL和死信交换机的实际代码示例

在 RabbitMQ 中,通过设置消息的 TTL(Time-To-Live)和配置死信交换机(DLX),可以实现延迟消息和异常消息的兜底处理。
声明死信队列与主队列
使用以下代码声明主队列并绑定死信交换机:
args := amqp.Table{
    "x-message-ttl":          10000, // 消息存活时间:10秒
    "x-dead-letter-exchange": "dlx.exchange", // 死信交换机名称
    "x-dead-letter-routing-key": "dlx.route",
}
// 声明主队列
ch.QueueDeclare("main.queue", false, false, false, false, args)
// 声明死信队列
ch.QueueDeclare("dlx.queue", false, false, false, false, nil)
// 绑定死信交换机
ch.QueueBind("dlx.queue", "dlx.route", "dlx.exchange", false, nil)
上述参数中,x-message-ttl 控制消息在队列中的最大存活时间,超时后自动进入死信交换机;x-dead-letter-exchange 指定死信转发的目标交换机,x-dead-letter-routing-key 可选地指定新的路由键。
消息处理流程
  • 生产者发送消息至主队列
  • 消息在队列中等待消费,超过 TTL 自动过期
  • RabbitMQ 将过期消息转发至死信交换机
  • 死信交换机根据路由规则投递到死信队列
  • 消费者从死信队列处理异常或延迟任务

3.3 消息进入死信队列的验证与调试方法

启用死信队列的日志监控
为验证消息是否成功进入死信队列,首先应开启 RabbitMQ 的消息追踪插件(rabbitmq_tracing),通过管理界面查看消息流转路径。启用命令如下:
rabbitmq-plugins enable rabbitmq_tracing
该插件允许捕获消息在交换机、队列间的流动过程,便于定位消息投递失败的具体环节。
模拟消息进入死信的场景
可通过设置短TTL或消费拒绝来触发死信机制。例如以下代码发送一条1秒后过期的消息:
channel.basic_publish(
    exchange='',
    routing_key='normal_queue',
    body='test message',
    properties=pika.BasicProperties(expiration='1000')  # 1秒过期
)
参数说明:`expiration` 表示消息生存时间(毫秒),当消息在队列中未被消费且超时,则自动转入配置的死信交换机。
检查死信队列接收状态
使用管理控制台或命令行工具查看死信队列中的消息数量与内容:
  • 登录 RabbitMQ 管理界面,访问 DLQ 对应队列页面
  • 确认“Ready”消息数是否增加
  • 执行“Get Message(s)”手动读取消息进行内容比对

第四章:业务场景中的高可用设计

4.1 订单超时未支付的异步处理方案

在高并发电商系统中,订单超时未支付的处理需依赖异步机制保障系统响应性能与数据一致性。采用消息队列延迟消息或定时任务扫描结合状态机的方式,可有效实现解耦。
基于消息队列的延迟处理
使用 RabbitMQ 的 TTL + 死信队列或 RocketMQ 的延迟消息功能,订单创建时发送一条延迟消息,超时后自动投递至处理服务。
// 发送延迟消息示例(RocketMQ)
msg := &rocketmq.Message{
    Topic: "order_timeout",
    Body:  []byte("order_id=12345"),
}
// 设置延迟等级为10(如30分钟)
producer.SendMessageAfterDelay(msg, 10)
该方式避免轮询,提升效率。延迟时间根据业务配置,消息到达后触发检查订单支付状态,若未支付则关闭订单并释放库存。
状态检查与资源释放
  • 消费端接收到超时消息后,首先查询订单最终支付状态,防止用户已支付但消息延迟;
  • 确认未支付后,更新订单状态为“已关闭”,并通过事务消息保证库存回滚原子性;
  • 记录操作日志,便于后续对账与监控。

4.2 死信消费者重试机制与幂等性保障

在消息系统中,当消息因异常无法被正常消费时,会被投递至死信队列(DLQ)。为提升系统容错能力,需设计合理的重试机制。
重试策略配置
采用指数退避重试策略,避免频繁重试导致服务雪崩:
// 配置消费者重试间隔与最大重试次数
func NewConsumer() *Consumer {
    return &Consumer{
        MaxRetries:      5,
        BaseRetryDelay:  time.Second,
        MaxRetryDelay:   30 * time.Second,
    }
}
上述代码中,BaseRetryDelay 控制首次重试延迟,MaxRetries 限制总重试次数,防止无限循环。
幂等性实现方案
为防止重复消费造成数据错乱,引入唯一消息ID与状态机校验:
  • 每条消息携带全局唯一ID(如UUID或业务键)
  • 消费者处理前查询是否已存在处理记录
  • 使用Redis记录已处理消息ID,设置TTL过期策略
通过结合重试控制与幂等性校验,确保死信消息可安全重放,系统最终一致性得以保障。

4.3 结合Redis实现补偿任务的联合控制

在分布式任务调度中,补偿任务常因网络抖动或节点故障而延迟执行。引入Redis可实现跨服务的状态协同与幂等控制。
状态标记与互斥控制
利用Redis的原子操作维护任务执行状态,避免重复触发:
// 设置任务锁定,防止并发执行
SET task_compensate_123 "running" EX 300 NX
若返回OK,表示获取执行权;若为nil,则跳过执行,保障全局唯一性。
失败队列与自动重试
将异常任务写入Redis List,配合定时轮询实现异步补偿:
  • 生产者:LPUSH retry_queue {task_id:123, retry:1}
  • 消费者:BRPOP retry_queue 5,取出后执行补偿逻辑
通过TTL机制与有序集合(ZSet)结合时间戳,还可实现延迟重试策略,提升系统弹性。

4.4 监控告警与死信堆积问题的应对策略

在消息中间件系统中,死信队列(DLQ)的堆积往往是业务处理异常或消费者性能瓶颈的直接体现。建立完善的监控告警机制是及时发现问题的关键。
核心监控指标
  • 死信队列消息数量突增
  • 消费者处理延迟(Lag)
  • 消息重试次数分布
自动化告警配置示例
{
  "alert": "dlq_message_count_high",
  "metric": "kafka_dlq_size",
  "threshold": 1000,
  "period": "5m",
  "action": ["notify:ops-team", "trigger:autoscale"]
}
该配置表示:当死信队列大小在5分钟内持续超过1000条时,触发通知运维团队并尝试自动扩缩容消费者实例。
应对策略流程
监控系统 → 指标异常 → 告警触发 → 自动扩容/降级 → 死信分析 → 修复上线 → 消费回放
通过实时监控与分级响应机制,可有效控制死信堆积风险,保障系统稳定性。

第五章:从开发到上线的最佳实践总结

持续集成与自动化测试
在现代软件交付流程中,CI/CD 流水线是保障质量与效率的核心。每次提交代码后,自动触发构建与单元测试能显著降低集成风险。例如,使用 GitHub Actions 配置自动化测试流程:

name: CI Pipeline
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.21'
      - name: Run tests
        run: go test -v ./...
环境一致性管理
开发、预发布与生产环境的差异常导致“在我机器上能运行”的问题。采用 Docker 容器化部署可确保环境一致性。通过统一的 Dockerfile 构建镜像,避免依赖冲突。
监控与日志策略
上线后系统稳定性依赖于可观测性建设。推荐使用 ELK(Elasticsearch, Logstash, Kibana)或 Loki 收集日志,并结合 Prometheus 与 Grafana 实现指标监控。关键指标包括:
  • HTTP 请求延迟(P95/P99)
  • 错误率(如 5xx 占比)
  • 数据库查询性能
  • 服务资源使用率(CPU、内存)
灰度发布与回滚机制
为降低上线风险,应实施灰度发布策略。通过 Kubernetes 的滚动更新配置,逐步将流量导向新版本:
策略描述适用场景
蓝绿部署全量切换流量低风险维护窗口
金丝雀发布按百分比导入流量新功能验证
流程图:代码提交 → 自动构建 → 镜像推送 → 部署到预发 → 自动化回归测试 → 灰度上线 → 全量发布
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
Spring Boot 中配置 RabbitMQ 死信队列(Dead Letter Exchange, DLX)是一种常见的消息可靠性处理机制。当消息在原始队列中被拒绝(`basicNack` 或 `basicReject`)、TTL 过期或队列达到最大长度时,RabbitMQ 可以将这些“死信”转发到一个指定的交换机(DLX),再由 DLX 路由到死信队列(DLQ)进行后续处理(如告警、重试、记录日志等)。 --- ## ✅ 实现步骤 1. 定义正常队列,并设置 `x-dead-letter-exchange` 和可选的 `x-dead-letter-routing-key` 2. 声明死信交换机(DLX)和死信队列(DLQ) 3. 绑定 DLX 到 DLQ 4. 发送消息到原队列,模拟消费失败或 TTL 过期 5. 消费者监听 DLQ 处理异常消息 --- ### 1. Maven 依赖(确保已引入 AMQP) ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` --- ### 2. 配置类:定义正常队列、DLX、DLQ 及绑定 ```java import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DlxRabbitConfig { // ================== 正常队列配置 ================== public static final String NORMAL_QUEUE_NAME = "queue.normal"; public static final String NORMAL_EXCHANGE_NAME = "exchange.normal"; public static final String NORMAL_ROUTING_KEY = "normal.key"; // 设置消息 TTL 为 10 秒(用于测试过期场景) @Bean public Queue normalQueue() { return QueueBuilder.durable(NORMAL_QUEUE_NAME) .withArgument("x-dead-letter-exchange", "exchange.dlx") // 指定死信交换机 .withArgument("x-dead-letter-routing-key", "routing.dlq") // 可选:指定死信路由键 .withArgument("x-message-ttl", 10000) // 消息10秒未处理则过期 .build(); } @Bean public TopicExchange normalExchange() { return new TopicExchange(NORMAL_EXCHANGE_NAME); } @Bean public Binding normalBinding() { return BindingBuilder.bind(normalQueue()) .to(normalExchange()) .with(NORMAL_ROUTING_KEY); } // ================== 死信交换机与队列配置 ================== public static final String DLX_EXCHANGE_NAME = "exchange.dlx"; public static final String DLQ_QUEUE_NAME = "queue.dlq"; @Bean public DirectExchange dlxExchange() { return new DirectExchange(DLX_EXCHANGE_NAME); } @Bean public Queue dlqQueue() { return QueueBuilder.durable(DLQ_QUEUE_NAME).build(); } @Bean public Binding dlqBinding() { return BindingBuilder.bind(dlqQueue()) .to(dlxExchange()) .with("routing.dlq"); // 与 x-dead-letter-routing-key 对应 } } ``` --- ### 3. 正常消费者(模拟处理失败或让消息过期) ```java import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import java.io.IOException; @Component public class NormalConsumer { @RabbitListener(queues = DlxRabbitConfig.NORMAL_QUEUE_NAME) public void listen(Message message, Channel channel) throws IOException { long deliveryTag = message.getMessageProperties().getDeliveryTag(); try { String msg = new String(message.getBody()); System.out.println("【正常队列】收到消息: " + msg); // 模拟业务处理失败 if (msg.contains("fail")) { System.err.println("处理失败,拒绝消息: " + msg); channel.basicNack(deliveryTag, false, false); // 不重入队,进入 DLX } else { // 成功处理 channel.basicAck(deliveryTag, false); System.out.println("消息已确认"); } } catch (Exception e) { System.err.println("异常发生: " + e.getMessage()); channel.basicNack(deliveryTag, false, false); // 拒绝并进入死信流程 } } } ``` > 💡 如果你不调用 `basicAck` 并且关闭了自动 ACK,或者设置了 TTL,消息也会因超时而变成死信。 --- ### 4. 死信队列消费者(处理异常/过期消息) ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class DlqConsumer { @RabbitListener(queues = DlxRabbitConfig.DLQ_QUEUE_NAME) public void listen(String msg) { System.out.println("⚠️【死信队列】收到死信消息: " + msg + ",请人工介入或重试!"); // 在这里可以做:记录数据库、发送告警、放入重试队列等 } } ``` --- ### 5. 生产者控制器(测试用) ```java import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class MessageController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/send/{msg}") public String sendMessage(@PathVariable String msg) { rabbitTemplate.convertAndSend(DlxRabbitConfig.NORMAL_EXCHANGE_NAME, DlxRabbitConfig.NORMAL_ROUTING_KEY, msg); return "消息已发送: " + msg; } } ``` --- ## 🧪 测试场景 | 场景 | 如何触发 | |------|----------| | **消息被拒绝** | 发送包含 `"fail"` 的消息 → `basicNack(requeue=false)` → 进入 DLQ | | **消息过期(TTL)** | 发送任意消息后等待 10s 以上未被消费 → 自动过期 → 进入 DLQ | | **队列满溢出** | 设置 `x-max-length` 限制队列长度,超出后旧消息变为死信 | #### 示例:添加队列长度限制(可选) ```java @Bean public Queue normalQueueWithMaxLength() { return QueueBuilder.durable(NORMAL_QUEUE_NAME) .withArgument("x-dead-letter-exchange", "exchange.dlx") .withArgument("x-message-ttl", 10000) .withArgument("x-max-length", 5) // 最多5条消息 .build(); } ``` --- ## 🔍 死信产生的三个条件(满足其一即可) 1. 消息被消费者 `basicNack` 或 `basicReject` 且 `requeue=false` 2. 消息的 TTL(存活时间)已过期 3. 队列达到最大长度(`x-max-length`),导致消息被挤出 --- ## 📌 注意事项 - `x-dead-letter-routing-key` 是可选的,如果不设置,则使用原始消息的 routing key。 - 死信消息的 header 中会自动添加一些信息(如 `x-death` 数组),可用于追踪原因。 - 不要将死信队列也配置成有 DLX,否则可能导致无限循环。 - 建议对 DLQ 做监控,防止积压。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值