我的应用程序消耗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秒以上(这是我从服务器获得的)。
答案 0 :(得分:3)
不幸的是,这似乎是一个网络问题。这可能是由于以下几点:
强制所有dynos重启的一种方法是运行$ heroku ps:restart
。这将迫使Heroku重新启动你的dynos,这通常意味着将它们移动到新的EC2主机。如果这是一次性问题,这可能会有所帮助。