Announcement

Collapse
No announcement yet.

Initialisierung in Servlet

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Initialisierung in Servlet

    Hallo zusammen!

    Ich habe ein Servlet, in dem ich gewisse Initialisierungen vornehme. Dieses Servlet wird beim Start der Web-App aufgerufen:

    <pre>
    &lt;servlet&gt;
    &lt;servlet-name&gt;init&lt;/servlet-name&gt;
    &lt;servlet-class&gt;InitServlet&lt;/servlet-class&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;
    </pre>

    Jetzt möchte ich gerne, dass das Laden der <i>gesamten</i> Web-App fehlschlägt, wenn hier was nicht funktioniert. Wenn ich aber in der <i>init()</i> Methode des Servlets eine Exception werfe, wird der Rest trotzdem geladen:

    <pre>
    public void init(ServletConfig servletConfig) throws ServletException {

    // ...

    throw new ServletException();

    // ...
    }
    </pre>

    Frage: Gibt es eine Möglichkeit, das Laden der Web-App über ein solches Initialisierungs-Servlet ggf. zu verhindern?

    Gruß, Jörg

  • #2
    Hallo Jörg,

    Einen portablen (also nur unter Benutzung von J2EE-Standard-APIs) gibt es nicht, eine komplette Webapplikation außer Funktion zu setzen. Die meisten Server bieten aber eigene Möglichkeiten an. Beim JBoss kann man sich über JMX diverse Deployer/Undeployer-Services holen und die Webapp einfach undeployen. Beim Tomcat kann ein Servlet das Interface ContainerServlet implementieren und bekommt dann einen Wrapper reingereicht, über den man an einen Deployer kommt, der ebenfall undeploy-Funktionalität bietet. Ich kann leider keinen Code liefern, ist schon lange her, seit ich das mal gemacht habe :-)

    Allerdings kann es sein, daß eine Webapp sich nicht selbst undeployen kann (weiß ich leider nicht). Zudem macht man sich sehr von den "Innereien" des Servers abhängig. Kann nicht einfach das "defekte" Servlet ein Flag in den ServletContext schreiben und die anderen Servlets leiten einfach auf eine statische Fehlerseite, wenn das Flag gesetzt ist?

    Ev. kann man auch die Initialisierung in einen ServletContextListener verlagern und bei fehlschlagen eine RuntimeException werfen. Erscheint mir jetzt auch etwas nach einer Holzhammermethode :-)

    Gruß,

    Alwi

    Comment


    • #3
      Hmm!

      Die einzige Chance eine Web-Anwendung J2ee Standardkonform selber außer Betrieb zu nehmen kann folgendermaßen geschehen:
      <br>
      a) Feststellen das ein Fehler passiert ist: Schreiben eines Fehlerstatus in den Application Context ( getServletContext().setAttribute("Alive", "false") )
      <br>
      b) Definition eines Filters auf alle Mappings ( "/*") der später immer ein Fehler wirft.
      Im Servlet API gibt es dafür ein Status Code HttpServletResponse.SC_SERVICE_UNAVAILABLE = 503
      <br>
      Trotzdem sind natürlich alle Servlets aktiv!
      <br>
      Pete

      Comment

      Working...
      X