10 Stimmen

Wie kann ich einen ServletContextListener dazu bringen, die Java EE-Anwendung zu stoppen?

Ich habe einen ServletContextListener, der beim Starten meiner Java EE-Anwendung einige Datenbankverwaltungsfunktionen ausführt. Dieser läuft in meiner Anwendung, bevor JPA und andere Teile der Anwendung gestartet/geladen werden. Wenn die Datenbankwartung fehlschlägt, protokolliere ich die Fehler. Wenn die Datenbankwartung fehlschlägt, funktioniert die Anwendung nicht richtig und ich möchte die Anwendung anhalten.

Wie kann ich anmutig und korrekt beenden die Anwendung von ServletContextListener.contextInitialized?

Die von Viven unten angegebene Lösung ist nahe dran, aber nicht ganz. Wenn ich eine RuntimeException auslöse, wird Glassfish in einem inkonsistenten Zustand belassen, in dem die Verwaltungskonsole nicht zugänglich ist, aber irgendein Prozess noch läuft und Port 3700 (IIOP?) offen hält, was dann einen Neustart verhindert.

5voto

Vivien Barousse Punkte 20205

Wenn Ihr ServletContextListener eine Ausnahme auslöst, wird die Webanwendung nicht korrekt geladen und der Anwendungsserver Mai alle nachfolgenden Anfragen blockieren (und mit einem 500-Fehler antworten).

Damit wird weder der Start der Anwendung verhindert noch die Anwendung gestoppt, aber es wird die weitere Nutzung der Anwendung verhindert und könnte in Ihrem Fall nützlich sein.

Nach entsprechender Überprüfung in der Spezifikation ist dieses Verhalten in der Spezifikation nicht zwingend vorgeschrieben. Der Server Mai (nicht なければならない ) geben 500 Fehler zurück. Diese Lösung muss daher mit Vorsicht verwendet werden.

Véase diese Antwort für ein Zitat aus der Servlet-Spezifikation.

5voto

kschneid Punkte 5578

Fangen Sie in Ihrem Listener alle Ausnahmen ab und verwenden Sie Servlet-Kontextattribute, um Flags oder andere nützliche Informationen über den Fehler zu speichern. Sie sollten wahrscheinlich auch etwas protokollieren, um anzuzeigen, dass die Anwendung nicht funktioniert.

An diesem Punkt können Ihre Optionen von der Architektur Ihrer Anwendung diktiert werden. Wenn alle Anfragen von einem einzigen Controller/Dispatcher Servlet bearbeitet werden, könnte es sinnvoll sein, dessen init Methode prüft die Kontextattribute und löst eine UnavailableException . Beachten Sie jedoch, dass die Ausnahme nur für das spezifische Servlet gilt, das sie auslöst. Dies macht den Ansatz weniger handhabbar, wenn Ihre Anwendung viele Servlets enthält oder direkten Zugriff auf andere Ressourcen erlaubt.

Eine andere Möglichkeit wäre, einen Filter zu erstellen, der jede Anfrage abfängt, die Kontextattribute überprüft und dann eine Ausnahme auslöst. Andere Varianten sind sicherlich möglich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X