【问题标题】:RabbitMQ spring JAVA Client Stopped consuming messages Resumed on RestartRabbitMQ spring JAVA客户端停止消费消息在重新启动时恢复
【发布时间】:2019-01-22 20:24:11
【问题描述】:

我在 java 中为 rabbitmq 消费者使用 spring-rabbit-1.7.1 库。我有 7 个消费者在运行,同样的服务器也是生产者。 突然消费者停止消费消息并在我重新启动它们时恢复。 没有异常,线程转储如下:

      SimpleAsyncTaskExecutor-1" #77 prio=5 os_prio=0 tid=0x00007f497ef34800 nid=0x4e93 waiting on condition [0x00007f490cee6000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x000000064c00bfa0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
        at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.nextMessage(BlockingQueueConsumer.java:439)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1212)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1187)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:96)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContai

"AMQP Connection 10.66.107.115:5672" #78 prio=5 os_prio=0 tid=0x00007f49901a5000 nid=0x4e94 runnable [0x00007f490cde5000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:170)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
        - locked <0x000000064c3534d0> (a java.io.BufferedInputStream)
        at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288)

随着队列中的消息数量不断增加,生产者工作正常。

【问题讨论】:

    标签: spring-boot rabbitmq spring-rabbit


    【解决方案1】:

    当前的 1.7.x 版本是 1.7.10。

    确保 enableAutoRecovery 在底层 RabbitMQ ConnectionFactory 中为 false。 4.0.x客户端默认设置为true; Spring AMQP 不需要客户端自动恢复,因为它从 1.0.0 开始就有自己的恢复机制。

    已经修复了几个错误以解决大多数兼容性问题,但应将其设置为false。 Spring AMQP 将自动禁用它,除非您提供预配置的 RabbitMQ ConnectionFactory - 例如在 PCF 上使用 spring-cloud-connectors。

    此问题已在 2.0.3 版本的连接器中得到修复。

    【讨论】:

    • 感谢您的回复。我确认 enableAutoRecovery 是错误的,我没有通过预先配置的 ConnectionFactory。我使用此设置已经一年了,第一次出现此问题。我有观察到很少有连接空闲 2 天,是否会导致某种静默连接中断?
    • 默认情况下启用心跳以防止丢失连接。尝试升级到 1.7.10。
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多