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.
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