RabbitMQ Java-Client - Wie können Ausnahmen und Shutdowns sinnvoll gehandhabt werden?

8

Hier ist, was ich bis jetzt weiß (bitte korrigieren Sie mich):

Im RabbitMQ Java-Client wird bei Operationen auf einem Kanal IOException ausgegeben, wenn ein allgemeiner Netzwerkfehler vorliegt (fehlerhafte Daten vom Broker, Authentifizierungsfehler, fehlende Herzschläge).

Operationen auf einem Kanal können auch die ShutdownSignalException ungeprüfte Ausnahme auslösen, normalerweise eine AlreadyClosedException , wenn wir versuchten, eine Aktion auf dem Kanal / der Verbindung auszuführen, nachdem diese heruntergefahren wurde.

Der Shutdown-Prozess findet statt im Falle eines "Netzwerkfehlers, eines internen Fehlers oder eines expliziten lokalen Herunterfahrens" > (zB über channel.close () oder connection.close ()). Das Shutdown-Ereignis wird in der "Topologie" von Connection - & gt; Kanal - & gt; Consumer, und wenn der Channel die Methode handleShutdown() des Verbrauchers aufruft, wird er aufgerufen.

Ein Benutzer kann auch einen Shutdown-Listener hinzufügen, der nach Abschluss des Herunterfahrens aufgerufen wird.

Hier fehlt mir:

  1. Da eine IOException einen Netzwerkfehler anzeigt, initiiert sie auch eine Anforderung zum Herunterfahren?
  2. Wie wirkt sich die Verwendung des automatischen Wiederherstellungsmodus auf Abschaltanforderungen aus? Wird die Kanaloperation blockiert, während sie versucht, die Verbindung zum Kanal wiederherzustellen, oder wird die ShutdownSignalException weiterhin ausgelöst?

Hier gehe ich im Moment mit Ausnahmen um, ist das ein vernünftiger Ansatz?

Meine Konfiguration besteht darin, dass ich einen Warteschlangenkonsumenten abfragt und Aufgaben an einen Arbeitspool weiterleitet. Der rabbitmq-Client ist hier in MyRabbitMQWrapper gekapselt. Wenn eine Ausnahme auftritt, die die Warteschlange abfragt, werde ich einfach alles herunterfahren und den Client neu starten. Wenn eine Ausnahme im Worker auftritt, protokolliere ich sie auch und beende den Worker.

Meine größte Sorge (bezogen auf Frage 1): Angenommen, es tritt eine IOException im Worker auf, dann wird die Task nicht bearbeitet. Wenn der Shutdown dann nicht auftritt, habe ich jetzt eine nicht-acked Aufgabe, die für immer in Schwebe sein wird.

Pseudocode:

%Vor%     
bcoughlan 12.08.2014, 10:52
quelle

1 Antwort

2

Sie können sich Lyra zur automatischen Wiederherstellung nach unerwarteten Verbindungs- / Kanal- / Verbrauchersperrungen ansehen.

    
Jonathan 18.09.2014 21:32
quelle

Tags und Links