rabbitmq中客户端30分钟未ack报错解决

错误复现:

Unhandled exception. RabbitMQ.Client.Exceptions.AlreadyClosedException: Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=406, text='PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more', classId=0, methodId=0

这个错误发生在 RabbitMQ 客户端,提示连接已经被关闭,并给出了关闭的原因:

  • close-reason,由对等方(Peer)发起;
  • code=406,表示 PRECONDITION_FAILED;
  • text=‘PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more’,说明是因为一个名为“channel 1”的通道上的消息确认超时了,并且在规定的时间内没有得到确认。在这里,超时值为 1800000 毫秒(30 分钟)。

那么如何解决呢,只要配置ack的超时时间即可,官方说明:
https://www.rabbitmq.com/consumers.html#acknowledgement-timeout

如果你是docker环境,那么有一点坑,就是通过环境变量所配置的consumer_timeout 是不生效的,如下:

version: "3"
services:
  rabbitmq:
    image: rabbitmq:3.8-management-alpine
    environment:
      - RABBITMQ_CONSUMER_TIMEOUT=600000 # 设置consumer_timeout参数为600000毫秒

需要在配置文件中动态设置参数:

version: "3"
services:
  rabbitmq:
    image: rabbitmq:3.8-management-alpine
    volumes:
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    environment:
      - RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf

在rabbitmq.conf文件中,设置consumer_timeout参数。如下:

default_pass = guest
default_user = guest
default_vhost = /
consumer_timeout = 600000

猜你喜欢

转载自blog.csdn.net/weixin_43702146/article/details/129580443