全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-22 8 分钟 ✍️ juanwangdev

死信队列配置

死信队列通过队列参数指定,核心参数为 x-dead-letter-exchangex-dead-letter-routing-key

核心参数

参数类型必填说明
x-dead-letter-exchangeString死信交换机名称
x-dead-letter-routing-keyString死信路由键,不填则保持原 routingKey

Java 示例:配置死信队列

Java
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.AMQP.BasicProperties.Builder;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

public class DlxQueueConfigExample {

    private static final String DLX_EXCHANGE = "dlx.exchange";
    private static final String DLX_QUEUE = "dlx.queue";
    private static final String BUSINESS_EXCHANGE = "order.exchange";
    private static final String BUSINESS_QUEUE = "order.queue";
    private static final String DLX_ROUTING_KEY = "order.dead";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 1. 声明死信交换机
            channel.exchangeDeclare(DLX_EXCHANGE, BuiltinExchangeType.DIRECT, true);

            // 2. 声明死信队列并绑定
            channel.queueDeclare(DLX_QUEUE, true, false, false, null);
            channel.queueBind(DLX_QUEUE, DLX_EXCHANGE, DLX_ROUTING_KEY);

            // 3. 声明业务交换机
            channel.exchangeDeclare(BUSINESS_EXCHANGE, BuiltinExchangeType.DIRECT, true);

            // 4. 声明业务队列,配置死信交换机和路由键
            Map<String, Object> args = new HashMap<>();
            args.put("x-dead-letter-exchange", DLX_EXCHANGE);
            args.put("x-dead-letter-routing-key", DLX_ROUTING_KEY);
            channel.queueDeclare(BUSINESS_QUEUE, true, false, false, args);
            channel.queueBind(BUSINESS_QUEUE, BUSINESS_EXCHANGE, "order.created");

            System.out.println("死信队列配置完成");
        }
    }
}

动态配置注意事项

  • 队列参数只能在 queueDeclare 时设置,无法在运行时修改
  • 如果队列已存在且参数不同,queueDeclare 会抛出 PRECONDITION_FAILED 异常
  • 解决方案:先删除队列,再重新声明(注意:删除队列会丢失其中的消息)

生产环境中建议使用队列策略(Policy)通过命令行配置 DLX,避免代码硬编码,便于运维调整。

使用 Policy 配置 DLX(可选)

Bash
# 通过 rabbitmqctl 为队列设置死信交换机
rabbitmqctl set_policy DLX "^order\." '{"dead-letter-exchange":"dlx.exchange"}' --apply-to queues

要点总结

  • 死信队列通过 x-dead-letter-exchange 参数指定
  • x-dead-letter-routing-key 可选,不填则保持原 routingKey
  • 队列参数不可变,修改需先删除队列
  • 生产环境建议使用 Policy 动态配置 DLX,降低代码侵入性
  • 死信队列需要手动声明并绑定到死信交换机

📝 发现内容有误?点击此处直接编辑

← 上一篇 死信消息处理
下一篇 → 并发消费者模型
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库