Meine Anwendung verbraucht einige Nachrichten von RabbitMQ und verarbeitet sie. Ich habe etwa 10 Warteschlangen und jede Warteschlange hat bis zu zehn Verbraucher (Threads). Ich habe einen Prefetch von 5. Ich verwende mein Setup in Heroku mit dem CloudAMQP-Plugin (RabbitMQ als Dienst).RabbitMQ Java-Client hört auf, Nachrichten zu konsumieren
Ich bin mit den Standard-Heartbeat und Connection Timeout-Einstellungen (60 Sekunden) ausgeführt.
Meine Java-Anwendung ist eine Spring-Boot-Anwendung mit der Feder-Kaninchen-Bibliothek.
Versionen:
RabbitMQ 3.5.3
Erlang 17.5.3
Java 1.8
Spring boot 1.3.2.RELEASE
Spring rabbit 1.5.3.RELEASE
Das Problem ist, dass für die Verbraucher von einer bestimmten Warteschlange Stop raubend Nachrichten nach einiger Zeit. Wenn ich meine Java-Anwendung neu starte, funktioniert alles einwandfrei. Die anderen Warteschlangen werden jedoch normal verbraucht. Keine Fehler auf der Anwendungsseite. Auf dem Protokollstrom Seite des Kaninchens Ich sehe einige Einträge wie
= REPORT==== 2016-08-02 15:53:32 UTC ===
closing AMQP connection <SOMETHING> (SOMETHING_ELSE -> SOMETHING_ELSE_ELSE):
{heartbeat_timeout,running}
ich lokal oder in einer Testumgebung in Heroku nicht wiedergeben kann.
aktualisieren
Der folgende Code kann in 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);
}
ich über 60 Sekunden (das ist, was ich bin immer vom Server des Herzschlages kann nicht den Wert erhöhen finden).
Hallo @rdegges. Danke für Ihre Hilfe. Der Plan ist groß genug, um alle Verbindungen zu bewältigen. Außerdem (das ist mein schlechtes, ich war nicht klar genug) arbeiten die Konsumenten alle anfänglich, aber gelegentlich hören die Konsumenten dieser besonderen Warteschlange auf zu konsumieren. Wenn ich die App neu starte, funktioniert alles einwandfrei und die Verbraucher beginnen wieder zu arbeiten. Ich kann es jedoch nicht reproduzieren. Meine App läuft auf einem großen Rechner (PL Web 1). Ich bin vertraut mit der Natur von Heroku infra (Neustart usw.) und die Anwendung kann damit umgehen. – alkis
Ich dachte, dass dies auf Überlastung zurückzuführen sein könnte, die zusammen mit der Heartbeat-Konfiguration dies verursacht.Ich warte darauf, dass dies wieder passiert und sehen, ob diese bestimmte Verbraucherverbindung von Kaninchen fallen gelassen wird, aber der Verbraucher bleibt unbewusst (dies würde das Fehlen von Fehlerprotokollen erklären). Wenn dies der Fall ist, könnte das Ändern des Heartbeats auf einen größeren Wert das Problem beheben. Aber ich weiß nicht, ob das möglich ist. Überprüfen Sie mein Update. – alkis
Ah, das macht es ein bisschen schwieriger zu diagnostizieren. Vor allem, wenn es nicht leicht reproduziert werden kann :(Aber dieser Verbraucher sollte die Verbindung neu starten, wenn es fällt. Ihre Heartbeat-Konfiguration sieht gut aus. – rdegges