如何在init-Exceptions上中止启动过程

时间:2016-04-06 05:56:51

标签: java servlets java-ee websphere

我在Websphere 8.5.5.8上有一个WebApplication,一个(或多或少是空的)EAR项目,它包含我的WAR项目。

在我的主Servlet中,在启动时加载,我会做一些检查,如果一切正常的话。 如果不是,我会抛出javax.servlet.ServletException

我的期望是,Websphere会认识到存在问题并中止我的应用程序的启动,因此它根本不可用。

实际发生的事情是,Websphere只记录Exception,只有Waring级别,Exception甚至在另一个文件中,而不是在Log本身:

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

然后我的应用程序仍然启动,因此它可用于浏览器。人们当然会开始使用它并稍后认识到存在问题。在挖掘了日志文件后,发现启动失败了。

问题: 我能做些什么让Websphere中止启动过程? 可能会抛出一种特殊的例外情况吗? 我试过了

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

我在IBM论坛中发现this,表明我的预期行为会违反JEE规范,这对我来说没什么用。

我尝试javax.servlet.ServletContextListener如上所述here,其中一个是,我会在日志中收到错误消息,但应用程序仍会启动。

如上所述[{3}}我试过了Startup Beans。在那里发布的解决方案对我不起作用,那些专有的启动bean是here,他们也是not allowed in a WAR。我只有一个EAR项目,因为Websphere / RAD迫使我在我的本地环境中使用它。在测试/生产系统中,仅使用WAR。

如果我使用EJB 3.1定义的启动bean:

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()");
    }
}

start()方法无法调用,我只在日志中看到postConstruct()消息。在postConstruct()中抛出异常不会中止启动过程。

1 个答案:

答案 0 :(得分:0)

到目前为止,我只想出了一个解决方法(受到https://stackoverflow.com/a/1337927/5072526中Jason Faust评论的启发):

有一个静态标志,如果初始化已正确完成,请将其设置为true。 使用过滤器检查该标志并输出错误,如果其为false,那么至少应用程序在启动失败时似乎可用:

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*/
}