一尘不染

RabbitMQ Java客户端停止使用消息

spring-boot

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

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

我的Java应用程序是使用spring-rabbit库的spring boot应用程序。

版本:

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秒以上(这是我从服务器获得的值)。


阅读 449

收藏
2020-05-30

共1个答案

一尘不染

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

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

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

2020-05-30