如何在 ServletContextListener 发生异常时中止 Tomcat 启动?

问题描述 投票:0回答:2

我有一个实现

ServletContextListener
的类,它在启动时加载一些资源。

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

我可以从

ServletContextListener.contextInitialized()
方法内部执行任何命令来停止整个 Tomcat 启动并使其失败吗?

java tomcat servlets
2个回答
12
投票

尝试指定:

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

在您的

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) {
    }
}

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


2
投票

如果您因为 Web 应用程序部署失败而想要停止 Tomcat,我假设您没有将其他应用程序部署到 Tomcat。在这种情况下,为什么不将此应用程序构建为带有嵌入式 Tomcat/Jetty 的独立 Web 应用程序呢?这样,只要你的 webapp 没有正常启动,嵌入式服务器也会关闭。

对我来说,您似乎专注于

ServletContextListener
来解决并非
ServletContextListener
的本意的问题。

请勿使用

System.exit()
,因为它会杀死可能正在运行其他已部署应用程序的服务器。如果可以,因为你知道永远不会有其他应用程序(而且你也不想),那么就制作一个独立的 Web 应用程序。这种不良做法在 CWE 中被列为潜在弱点:CWE-382

提示:Spring Boot 有助于构建带有嵌入式服务器的独立 Web 应用程序。请参阅本指南:https://spring.io/guides/gs/spring-boot/

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

© www.soinside.com 2019 - 2024. All rights reserved.