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管理界面删除相关的交换机和队列,启动项目就不会报错了

三、后续遇到会继续补充

posted @   xudong5273  阅读(1968)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示