【Rabbitmq】报错:ERROR CachingConnectionFactory Channel shutdown: channel error
原文链接:
【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:
这个监听器配置包含两个部分:direct
和simple
。
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就会报错