RabbitMQ java客户端停止使用消息

时间:2016-08-04 15:32:50

标签: java heroku spring-boot rabbitmq spring-rabbitmq

我的应用程序消耗RabbitMQ的一些消息并处理它们。 我有大约10个队列,每个队列最多有10个消费者(线程)。 我有一个5的预取。我正在使用CloudAMQP插件(RabbitMQ即服务)在Heroku中运行我的设置。

我正在使用默认的心跳和连接超时设置(60秒)运行。

我的java应用程序是一个使用spring-rabbit库的Spring启动应用程序。

版本:

RabbitMQ 3.5.3 
Erlang 17.5.3
Java 1.8
Spring boot 1.3.2.RELEASE
Spring rabbit 1.5.3.RELEASE

问题是一个特定队列的消费者在一段时间后停止消费消息。当我重新启动我的java应用程序时,一切正常。其他队列正在正常消耗。应用程序方面没有错误。在兔子的日志流中,我看到了一些像

这样的条目
= REPORT==== 2016-08-02 15:53:32 UTC ===
closing AMQP connection <SOMETHING> (SOMETHING_ELSE -> SOMETHING_ELSE_ELSE):
{heartbeat_timeout,running}

我无法在本地或在Heroku的测试环境中重现。

更新

以下代码可在AMQConnection.class

中找到
int heartbeat = negotiatedMaxValue(this.requestedHeartbeat,
                                   connTune.getHeartbeat());


private static int negotiatedMaxValue(int clientValue, int serverValue) {
        return (clientValue == 0 || serverValue == 0) ?
            Math.max(clientValue, serverValue) :
            Math.min(clientValue, serverValue);
}

我不能将心跳的值增加到60秒以上(这是我从服务器获得的)。

1 个答案:

答案 0 :(得分:3)

不幸的是,这似乎是一个网络问题。这可能是由于以下几点:

  • CloudAMQP服务存在一些问题并且正在终止您的连接(不太可能,因为您的其他消费者工作正常)。
  • 您的CloudAMQP计划不允许任意数量的并发连接。您是否检查过以确保您的计划足够高以支持您的所有消费者? https://elements.heroku.com/addons/cloudamqp
  • 您的Heroku dyno与有问题的消费者正在重新启动,这会丢失您的连接。 Heroku dynos定期重启。如果您的dynos无法正常重启,您可能需要调查原因。
  • 你的一个Heroku dynos正在遇到网络问题(在这种情况下,它可能会在没有你干预的情况下自行重启)。

强制所有dynos重启的一种方法是运行$ heroku ps:restart。这将迫使Heroku重新启动你的d​​ynos,这通常意味着将它们移动到新的EC2主机。如果这是一次性问题,这可能会有所帮助。