Ich muss einige Daten vorzugsweise speichern, wenn die Java-Web-Anwendung gestoppt ist, oder wenn Tomcat gestoppt ist. Wie kann das gemacht werden? Edit: irgendein Nachteil, wenn ich den jvm Shutdown-Haken verwende?Shutdown-Hook für Java Web-Anwendung
Antwort
Verwenden Sie eine Klasse, die ServletContextListener in Ihrem web.xml implementiert:
<web-app>
<!-- Usual stuff here -->
<listener>
<listener-class>com.mycompany.MyClass</listener-class>
</listener>
</web-app>
Warum wollen Sie es beim Herunterfahren speziell tun? Und brauchen Sie wirklich brauchen Sie um es zu speichern (wie in "ist es absolut kritisch?") Oder würden Sie wie (wie wäre "schön, aber ich werde ohne es leben")?
Die Unterscheidung ist wichtig - egal, welche Methode Sie versuchen (Servlet/Kontext Zuhörer wie durch andere Antworten oder JVM shutdown hook vorgeschlagen) gibt es keine Garantien , dass es tatsächlich aufgerufen werden.
Servlet/Kontext Listener zerstören Ereignisse würden nur während normalen (anmutigen) Container-Shutdown ODER während des Neuladens der Anwendung ausgelöst werden. JVM Shutdown Hook würde auch während der Prozessunterbrechung ausgelöst werden; Das Töten eines Prozesses (oder das Ausschalten der Kraft) würde jedoch offensichtlich auch keinen auslösen.
Es ist in der Kategorie "wäre nett, aber ich werde ohne es leben". Ich muss eine Reihe von Servern Status speichern, die meine App versucht, eine Verbindung zu einer Datei (nicht db) zu erstellen, wenn die App heruntergefahren wird und dann diese Informationen erneut laden, wenn die Anwendung erneut gestartet wird. Wenn meine App versucht, eine Verbindung mit einem Server herzustellen, und sie inaktiv ist, wird sie als inaktiv markiert, sodass sie nicht erneut versucht werden muss. Da die Abfragen häufig auftreten, markiere ich diese Status nur im Speicher, nicht in der Datei. Wenn die App heruntergefahren wird, wäre es daher schön, sich daran zu erinnern, welche Server ausgefallen sind. – user121196
Ich neige zu ServletContextListener oder JVM-Hook – user121196
Verwenden Sie keinen JVM-Hook - das ist mehr für Tomcat selbst oder für Desktop-Anwendungen. Sie sollten definitiv einen ServletContextListener über einen JVM-Hook bevorzugen. –
Ich empfehle, mit ehcache diese Informationen zwischenzuspeichern. Wenn Sie den persistenten Speicher von ehcache verwenden, sind die zwischengespeicherten Daten auch nach einem erneuten Start von Tomcat weiterhin verfügbar.
In der Tat delegiert dies das Problem an ehcache, das für diese Art von Problemen optimiert ist.
Als Ergänzung zu leonm Antwort:
Wenn Sie Frühling verwenden, Sie Spring „Lifecycle Management“ verwenden können, um einen ähnlichen Effekt zu erzielen. Sie können beispielsweise eine Methode in einer Bean mit @PreDestroy
annotieren, damit sie beim Herunterfahren des Containers automatisch aufgerufen wird. Auf diese Weise müssen Sie nichts in die web.xml
setzen.
** Noch einfacher jetzt ... ** Die Annotation ['@ WebListener'] (http://docs.oracle.com/javaee/7/api/javax/servlet/annotation/WebListener.html) wurde zu [Servlet 3.0 spec] (https://jcp.org/en/jsr/detail?id=315) gibt Ihnen jetzt dieses Verhalten ohne die Mühe, die web.xml zu bearbeiten. Sehen Sie diese leuchtende [Antwort von BalusC] (http://stackoverflow.com/a/9186070/642706). –