死信队列配置
死信队列通过队列参数指定,核心参数为 x-dead-letter-exchange 和 x-dead-letter-routing-key。
核心参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| x-dead-letter-exchange | String | 是 | 死信交换机名称 |
| x-dead-letter-routing-key | String | 否 | 死信路由键,不填则保持原 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,降低代码侵入性
- 死信队列需要手动声明并绑定到死信交换机
📝 发现内容有误?点击此处直接编辑