如何在ServletContextListener中的异常中止Tomcat启动?

时间:2012-12-18 12:13:24

标签: java tomcat servlets

我有一个实现ServletContextListener的类,它在启动时加载一些资源。

当我的逻辑中出现一些不良事件时,这些资源对于我希望在整个启动时失败的方式对应用程序至关重要。

我是否可以从ServletContextListener.contextInitialized()方法中执行任何命令来停止和失败整个Tomcat启动?

2 个答案:

答案 0 :(得分:11)

尝试指定:

-Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE=true

java运行时选项中,引用official documentation

  

如果为true,则在服务器初始化阶段发生异常时服务器将退出。

     

如果未指定,将使用默认值false。

更新:

如果您想通过代码执行此操作,System.exit()会有效吗?

public class FailFastListener implements ServletContextListener {

    private static final Logger log = LoggerFactory.getLogger(FailFastListener.class);

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        try {
            //initialization
        } catch(Exception e) {
            log.error("Sooo bad, shutting down", e);
            System.exit(1);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}

您可以使用模式来包装现有的侦听器,而不会使它们混乱。不确定Tomcat会如何反应......

答案 1 :(得分:1)

如果你想停止Tomcat,因为你的webapp未能部署,我认为你没有将其他应用程序部署到tomcat。在这种情况下,为什么不将这个应用程序构建为带有嵌入式Tomcat / Jetty的独立webapp?这样,只要您的webapp无法正常启动,嵌入式服务器也将关闭。

对我而言,您似乎专注于ServletContextListener来解决不是ServletContextListener意图的问题。

不要使用System.exit()因为它会杀死可能我运行其他已部署应用的服务器。如果它没问题,因为您知道永远不会有其他应用程序(而且您不想要),那么请创建一个独立的Web应用程序。这种不良做法在CWE中列为潜在的弱点:CWE-382

只是一个提示:spring boot有助于构建带有嵌入式服务器的独立webapp。请参阅本指南:https://spring.io/guides/gs/spring-boot/

好的文章解释了为什么这可能是您正在寻找的:http://www.beyondjava.net/blog/application-servers-sort-of-dead/