2016-04-06 7 views
1

Ich habe eine WebApplication auf Websphere 8.5.5.8, ein (mehr oder weniger leeres) EAR-Projekt, das mein WAR-Projekt enthält.So brechen Sie die Startprozedur bei Init-Exceptions ab

In meinem Haupt-Servlet, das beim Start geladen wird, überprüfe ich, ob alles in Ordnung ist. Wenn es nicht ist, werfe ich eine javax.servlet.ServletException.

Meine Erwartung ist, dass Websphere erkennen würde, dass es ein Problem gibt und den Start meiner Anwendung abbrechen, so dass es überhaupt nicht verwendbar ist.

Was tatsächlich passiert ist, Websphere meldet sich nur diese Ausnahme weg mit nur Waring Ebene, die Ausnahme ist auch in einer anderen Datei, nicht im Protokoll selbst:

[06.04.16 07:42:27:229 CEST] 0000004c FfdcProvider W com.ibm.ws.ffdc.impl.FfdcProvider logIncident FFDC1003I: FFDC-Vorfall an C:\IBM\WAS8.5\profiles\AppSrv01\logs\ffdc\server1_bb44715_16.04.06_07.42.27.2056702894000999712166.txt com.ibm.ws.webcontainer.servlet.ServletInstance.init 259 erstellt. 

Dann wird meine Anwendung gestartet sowieso so es ist verfügbar für die Verwendung mit einem Browser. Die Leute beginnen dann natürlich damit und erkennen später, dass es ein Problem gibt. Nach dem Graben in Log-Dateien kommt heraus, dass der Start fehlgeschlagen ist.

Frage: Was kann ich tun, damit WebSphere den Startvorgang abbricht? Gibt es vielleicht eine besondere Art von Ausnahme, die ich werfen könnte? Ich versuchte

  • javax.servlet.ServletException
  • javax.servlet.UnavailableException
  • java.lang.Error

fand ich this in dem IBM Forum, was darauf hindeutet, dass mein erwartetes Verhalten die JEE Spec verletzen würde, das würde nicht viel Sinn für mich.

Ich versuchte eine javax.servlet.ServletContextListener wie erwähnt , ein Plus ist, dass ich eine Fehlermeldung im Protokoll bekommen werde, aber die Anwendung startet noch.

Wie erwähnt here habe ich versucht, die Startup-Bohnen. Die dort veröffentlichte Lösung funktioniert nicht für mich, diese proprietären Start-Beans sind not allowed in a WAR, und sie sind auch Deprecated. Ich habe nur ein EAR-Projekt, da Websphere/RAD mich dazu zwingt, eins in meiner lokalen Umgebung zu verwenden. Auf Test-/Produktionssystemen wird nur der WAR verwendet.

Wenn ich die Start Bohnen um 3,1 EJB definiert verwenden:

import javax.annotation.PostConstruct; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 
@Singleton 
@Startup 
public class MyStartupBean { 
    public boolean start() { 
     System.out.println("MyStartupBean.start()"); 
     return false; 
    } 
    public void stop(){ 
     System.out.println("MyStartupBean.stop()"); 
    } 
    @PostConstruct 
    public void postConstruct() { 
     System.out.println("MyStartupBean.postConstruct()"); 
    } 
} 

Die start() Methode aufgerufen nicht, ich nur sieht die postConstruct() Nachricht in meinem Logbuch. Durch das Auslösen einer Ausnahme in postConstruct() wird der Startvorgang nicht abgebrochen.

+0

Mögliches Duplikat [Prevent Java EE-Anwendung auf WebSphere auf Ausnahme starten ] (http://stackoverflow.com/questions/1337421/prevent-java-ee-application-start-on-websphere-on-exception) – fnt

Antwort

0

Bisher kam ich nur mit einer Umgehung (durch den Kommentar von Jason Faust in https://stackoverflow.com/a/1337927/5072526 inspiriert) nach oben:

hat eine statische Flagge, und wenn die Initialisierung korrekt abgeschlossen ist, setzen Sie sich auf true. einen Filter verwenden, die Flagge und Ausgabe ein Fehler, wenn seine falsch zu überprüfen, so dass zumindest die Anwendung dosen't verwendbar scheint, wenn das Startup fehlgeschlagen:

public class HealthCheckFilter implements Filter{ 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     if(AppBridge.isStartupFinished()) { 
      chain.doFilter(request, response); 
     }else { 
      HttpServletResponse httpResponse = (HttpServletResponse) response; 
      httpResponse.setCharacterEncoding(AppConstants.ENCODING); 
      httpResponse.setContentType("text/plain"); 
      httpResponse.setStatus(500); 
      PrintWriter out = httpResponse.getWriter(); 
      out.write("Startup failed"); 
     } 
    } 
    /* Methods init(FilterConfig filterConfig) and destroy() ommitted*/ 
} 
Verwandte Themen