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:
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%