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

uri*_*rir 9 java tomcat servlets

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

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

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

Tom*_*icz 11

尝试指定:

-Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE=true
Run Code Online (Sandbox Code Playgroud)

java运行时选项中,引用官方文档:

如果为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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 有人找到除System.exit(1)以外的任何其他方式吗?-Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE = true在这种情况下不起作用,因为contextInitialized方法中的异常不被视为服务器故障,只是servlet故障. (3认同)