# Deploy und undeploy - wie kann meine WAR Datei das mitbekommen?



## Grizzly (18. Okt 2011)

Hallo zusammen,

obwohl ich im Java Umfeld schon mehr als 10 Jahre unterwegs bin, fange ich erst gerade an mich mit dem Thema JSP, Servlets und Struts2 zu beschäftigen. Meine erste kleine Struts2 Anwendungen habe ich bereits fertig. Nun bin ich über das Problem gestolpert, dass ich gerne gewusst hätte, wann meine WAR Datei deployt bzw. undeployt wird. Das wäre interessant für Initialisierung und Deinitalisierung von bestimmten Dingen (Persistenz Schicht, Business Logic, usw.). In meiner Struts2 Anwendung war das kein Problem, da ich Jetty verwendet habe und ich die ganzen Sachen außerhalb initialisiert und deinitalisiert habe. Aber die Konstellation wird es nicht bei jedem Projekt geben.

Nachdem ich etwas im Internet gesucht habe, bin ich über folgendes Interface gestolpert: ServletContextListener
Wenn ich die folgenden Seiten richtig verstehe:
How to Initialize a Database on Application Startup.
MBeans and Tomcat: A HOWTO Guide for Managing YOUR Application
muss ich eine Ableitung dieses Interfaces in meiner WAR Datei haben und dann diesen Listener in die web.xml entsprechend eintragen.
Was mir noch nicht ganz klar ist: Wird dieser Eintrag nur von Tomcat ausgewertet? Oder funktioniert das auch mit anderen Java Servlet Containern? Wird der Listener bei jedem Servlet Aufruf aufgerufen? Oder nur vor dem ersten Servlet Aufruf (sprich nach dem Deploy) und nach dem letzten Servlet Aufruf (sprich vor dem Undeploy)?

Oder bin ich mit dem Listener völlig auf dem falschen Ast und es gibt eine viel bessere Möglichkeit? Möglichst eine, die sich innerhalb der WAR Datei lösen lässt und keine Anpassungen an Dateien des Servers / Java Servlet Containern benötigt.


----------



## nillehammer (18. Okt 2011)

> Wird dieser Eintrag nur von Tomcat ausgewertet? Oder funktioniert das auch mit anderen Java Servlet Containern?


Das ist ein Standard, der von allen JEE-kompatiblen Containern unterstützt wird.


> Wird der Listener bei jedem Servlet Aufruf aufgerufen? Oder nur vor dem ersten Servlet Aufruf (sprich nach dem Deploy) und nach dem letzten Servlet Aufruf (sprich vor dem Undeploy)?


Die Namen der Methoden geben Dir schon einen Hinweis darauf, wann sie aufgerufen werden. "contextInitialized" wird aufgerufen, wenn der Context initialisiert wird. Context ist die Webanwendung. D.h. wenn die Webanwendung gestartet wird, wird die Methode aufgerufen. Start ist nicht unbedingt gleich deploy. Du kannst Webanwendungen auch starten und stoppen, ohne sie neu zu deployen. Für "contextDestroyed" gilt entsprechendes für das Stoppen der Anwendung.



> Oder bin ich mit dem Listener völlig auf dem falschen Ast und es gibt eine viel bessere Möglichkeit?


Der ServletContextListener ist schon ein guter Ansatz. Wie gesagt mit der Einschränkung, dass die Eventhandler auch beim einfachen Start/Stop aufgerufen werden. Einen Listener, der nur auf Deploy/Undeploy reagiert, gibt es meines Wissens nicht. Da wärest Du dann auf die (Serverspezifischen) funktionen angewiesen.


----------



## Grizzly (18. Okt 2011)

Okay, wunderbar. Danke für die Info. Das passt dann schon so. So lange es nach jedem Deploy aufgerufen wird - egal wann, Hauptsache vor dem ersten Servlet - und vor jedem Undeploy ist es okay. Wenn es dazwischen auch noch aufgerufen wird, ist das kein Problem. Problematisch wäre es nur, wenn es wirklich vor und nach jedem Servlet aufgerufen werden würde.


----------

