Oct 032007
 

Nahezu jede JEE Web-Applikation muss beim Start diverse Initialisierungen ausführen. Denkbar ist das Registrieren von MBeans in einem JMX-Server, das Starten einer Job-Scheduling-Engine oder auch anderes. Dabei fällt immer mal wieder der Begriff “InitServlet” – also ein Servlet, welches keine HTTP-Requests entgegen nimmt sondern nur der Initialisierung einer JEE WebApp dient.


Das InitServlet wird so im “web.xml” Deployment Deskriptor deklariert, dass es bei Start der JEE Applikation instanziiert und initialisiert wird:

<servlet>
  <servlet-name>InitServlet</servlet-name>
  <servlet-class>yourpackage.servlet.InitServlet</servlet-class>
  <load-on-startup>0</load-on-startup>
 </servlet>

Das mutet doch irgendwie seltsam an, oder? Ein Servlet welches eigentlich gar nichts “serviert” – also keine HTTP-Requests verarbeitet, weil es nicht durch entsprechende “servlet-mapping” Elemente in der “web.xml” per HTTP erreichbar gemacht wurde.

Ein saubereres Konzept versprechen ServletContextListener, die mit der Servlet API 2.3 eingeführt wurden. Eine Klasse welches die Schnittstelle ServletContextListener implementiert, wird in “web.xml” deklariert. Der Web Container instanziiert diese Klasse und ruft die Methoden “contextInitialized” und “contextDestroyed” auf, wenn die WebApp gestartet bzw. gestoppt wurde. Hierdurch ist also eine “sauberere” Initialisierung einer WebApp möglich. Für manchen soweit nichts Neues.

Im InitServlet wird die WebApp Initialisierung ausgehend von der Methode “init(ServletConfig)” durchgeführt. Im Gegensatz zu den Callback-Methoden von ServletContextListener kann im InitServlet eine ServletException geworfen werden um kritische Probleme bei der Initialisierung zu melden. Die Folge der ServletException an dieser Stelle, ist die Beendigung des Life Cycles des InitServlet. Der Rest der WebApp – also andere Servlets – werden dennoch ausgeführt.

Wie kann ein kritisches Problem bei der Initialisierung festgestellt und der Start der WebApp verhindert werden? Man könnte die init-Methoden aller weiteren Servlets fehlschlagen lassen, weil die Initialisierung nicht erfolgreich abgeschlossen wurde. Aber wozu? Was zählt ist, dass das Initialisierungsproblem mit dem entsprechenden Log-Level im rausgeschrieben wird.

Das Fazit dieses Vergleichs bzgl. JEE WebApp Initialisierung lautet für mich: ServletContextListener schlägt InitServlet. Andere Meinungen?

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>