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管理界面删除相关的交换机和队列,启动项目就不会报错了
三、后续遇到会继续补充

浙公网安备 33010602011771号