springboot+rabbitmq报错合集
以下是本人遇到的问题和相对应的解决方案
一、Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)
场景:
使用RabbitTemplate操作mq,使用@RabbitListener申明消费者,并且在方法中手动ACK,发送消息的过程中报如下错误
Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)
百度到下面的回答:
百度回答
大致场景是启动springboot时报错;原因是:当应用启动时,spring 会去检查注册的队列,跟服务器上的队列配置是否一致,如果不一致,则抛出这个错误
但是我的并不是启动报错;
原因是使用@RabbitListener注解会自动ACK,如果方法中再手动ACK会造成重复ACK,所以报错
解决:
@RabbitListener(bindings = @QueueBinding(exchange = @Exchange(value = EXCHANGE_NAME, type = ExchangeTypes.DIRECT),
key = VERIFICATION_CODE_ROUTE_KEY,
value = @Queue(value = VERIFICATION_CODE_QUEUE, autoDelete = "false"),
ignoreDeclarationExceptions = "true"),
concurrency = "1",
ackMode = "MANUAL" // 《== 重点
)
重点是需要设置ackMode属性,该属性是指定ack方式为手动,可以在org.springframework.amqp.core.AcknowledgeMode 枚举类中查看一共有三种方式;
另一种方式是使用 org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer类的方法设置:
//设置消费者ack消息的模式,默认是自动,此处设置为手动
container.setAcknowledgeMode(AcknowledgeMode.MANUAL);
二、protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-dead-letter-exchange' for queue 'platform.queue' in vhost '/': received the value 'dead.platform.exchange.direct' of type 'longstr' but current is none, class-id=50, method-id=10)
问题原因:因为本人的代码会自动创建交换机、队列,并相互绑定, 所以这里的问题是交换机或者队列已经存在
解决方法:在rabbitmq管理界面删除相关的交换机和队列,启动项目就不会报错了
三、后续遇到会继续补充
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异