我的應用程序從RabbitMQ消費一些消息並處理它們。 我有大約10個隊列,每個隊列有多達10個消費者(線程)。 我有一個預取5.我使用CloudAMQP插件(RabbitMQ作爲服務)在Heroku中運行我的設置。RabbitMQ java客戶端停止消費消息
我正在運行默認的心跳和連接超時設置(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秒的心跳值(這是我從服務器獲取)。
你好@rdegges。感謝您的幫助。該計劃足夠大來處理所有的連接。此外(這是我的不好,我不清楚)消費者最初都在工作,但偶爾這個特定隊列的消費者會停止消費。如果我重新啓動應用程序,那麼一切正常,消費者再次開始工作。我不能重現它。我的應用程序運行在一臺大型機器上(PL Web 1)。我熟悉heroku infra的性質(重新啓動等),應用程序可以處理這個問題。 – alkis
我在想這可能是由於過載與心跳配置相結合導致的。我正在等待這種情況再次發生,看看這個特定的消費者連接是否被兔子丟棄,但消費者仍然沒有意識到(這將解釋沒有任何錯誤日誌)。如果發生這種情況,那麼將心跳更改爲更大的值可能會修復它。但我不知道這是否可能。檢查我的更新。 – alkis
啊,這使診斷更加棘手。特別是如果它不能很容易地複製:(但是,消費者應該重新啓動連接,如果它下降。你的心跳配置看起來很好給我 – rdegges