1 2 16:50:10.134 ERROR 17788 --- o.s.a.r.c.CachingConnectionFactory : 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) 在设置手动确认ACK后老是会出现这个错误,虽然不影响消息接收,但是每次报错都会重连。 除了在配置文件中设置手动ack以外,还需要在RabbitMQConfig中设置,按照参考文章上说的是
被注解注入的SimpleRabbitListenerContainerFactory覆盖,而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false),于是导致了两次ack,所以报错。
因为需要手动设置ack的话,那么在消费端需要@RabbitListener注解放到方法上,同时指定containerFactory,不然会出现无限循环错误。官方解释 而刚好设置了 rabbitListenerContainerFactory ,返回类型是SimpleRabbitListenerContainerFactory,刚好被覆盖了,所以得再次手动设置一次。
1 2 3 4 5 @RabbitHandler @RabbitListener(queues = "DirectQueue", containerFactory = "rabbitListenerContainerFactory") public void listen(Message message, Channel channel) { //........................... } 1 2 3 4 5 6 7 8 9 #消费者最小数量 spring.rabbitmq.listener.simple.concurrency=1 #消费之最大数量 spring.rabbitmq.listener.simple.max-concurrency=10 #设置消费端手动 ack # 被注解注入的SimpleRabbitListenerContainerFactory覆盖,而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false),于是导致了两次ack,所以报错。 spring.rabbitmq.listener.simple.acknowledge-mode=manual # 限流 #spring.rabbitmq.listener.simple.prefetch=1 ...