You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot队列配置:消息入死信队列后x-delivery-count消失是否为默认行为?

关于死信队列中x-delivery-count头部消失的问题

是的,这是RabbitMQ的默认行为。

原因说明

x-delivery-count是源队列专属的投递计数头部:它由RabbitMQ在尝试将消息投递到消费者时,由当前处理的队列添加,用来记录这条消息在该队列内被投递的次数。当消息触发死信规则(比如达到x-delivery-limit限制、被消费者拒绝且不重新入队等)进入死信队列时,RabbitMQ不会自动将这个头部复制到死信消息中——死信队列会把这条消息当作新消息处理,不会保留源队列的投递计数信息。

如何保留投递计数

如果需要在死信消息中保留原始的投递次数,可以通过以下方式实现:

  • 手动复制头部:在消费者处理消息失败、准备拒绝消息时,将x-delivery-count的值复制到自定义的消息头部中,再拒绝消息让其进入死信队列。示例代码如下:
@RabbitListener(queues = "altpay-initial-checkout-queue")
public void handleCheckoutMessage(Message message, Channel channel) throws IOException {
    try {
        // 业务处理逻辑
        processMessage(message);
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    } catch (Exception e) {
        // 获取源队列的投递计数
        Integer deliveryCount = (Integer) message.getMessageProperties().getHeaders().get("x-delivery-count");
        if (deliveryCount != null) {
            // 添加自定义头部保存原始计数
            message.getMessageProperties().getHeaders().put("original-delivery-count", deliveryCount);
        }
        // 拒绝消息,不重新入队,触发死信
        channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
    }
}
  • 使用自定义拦截器:通过RabbitMQ的消息拦截器(比如RabbitTemplate的拦截器),在消息转死信的环节自动复制x-delivery-count头部到死信消息中。

内容的提问来源于stack exchange,提问作者fragilepriCe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:08:21