【Rabbitmq】报错:ERROR CachingConnectionFactory Channel shutdown: channel error

发布时间 2023-08-07 15:39:17作者: 进击的小蔡鸟

原文链接: 【Rabbitmq】报错:ERROR CachingConnectionFactory Channel shutdown: channel error

异常信息

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)
2023-08-07 13:04:24.882  INFO 18392 --- [ntContainer#1-1] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@1ac0a68: tags=[[amq.ctag-iB0w0uBX7aIeM0VwFMMmYw]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@192.168.153.131:5672/,2), conn: Proxy@1f15a50 Shared Rabbit Connection: SimpleConnection@829dbc [delegate=amqp://guest@192.168.153.131:5672/, localPort= 60615], acknowledgeMode=MANUAL local queue size=0

01 报错原因

默认是自动ack,但代码又手动ack,导致ack了两次

02 解决方案

2.1 全局配置

spring:
  rabbitmq:
    host: 192.168.153.131
    listener:
      direct:
        acknowledge-mode: manual
      simple:
        acknowledge-mode: manual 

ps:

这个监听器配置包含两个部分:directsimple

  • direct:这是一种监听器类型,通常用于直接处理消息。
    • acknowledge-mode: manual:这表示direct监听器使用了手动确认模式,需要显式地调用确认方法来确认已处理的消息。
  • simple:这是另一种监听器类型,通常用于简单的消息处理场景。
    • acknowledge-mode: manual:同样,这表示simple监听器也使用了手动确认模式。

这个配置中的两个监听器都使用了手动确认模式,

2.2 注解方式

在注解中指定ack方式

@RabbitListener(queues = "que",ackMode = "MANUAL")

ps:

@RabbitListener(queues = "que")

默认是自动ack,默认的监听器类型为simple

例如: 如果在全局配置中指定direct类型的监听器使用manual手动确认模式,未指定simple,那么在加了@RabbitListener(queues = "que")方法代码中手动ack就会报错