Channel shutdown: channel error; protocol method:
springboot + rabbitMq
场景:使用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);
当然这种方式不是采用注解来实现消费者,主要是要知道注解的原理应该也是通过这样的方式来实现的,这里我没有深究,暂时就到这里。