如何在ServletContextException中中止Tomcat启动?

xoefb8l8  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(160)

我有一个实现ServletContextListener的类,它在启动时加载一些资源。
这些资源对于应用程序来说是至关重要的,当我的逻辑中发生一些错误事件时,我希望整个启动失败。
有没有什么命令可以从ServletContextListener.contextInitialized()方法内部执行,以停止并使整个Tomcat启动失败?

s8vozzvw

s8vozzvw1#

尝试指定:

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


你可以使用decorator模式来 Package 现有的侦听器,而不会使它们变得混乱。

kse8i1jr

kse8i1jr2#

如果你想停止Tomcat,因为你的webapp部署失败,我假设你没有其他的app部署到tomcat。在这种情况下,为什么你不把这个app构建成一个嵌入了Tomcat/Jetty的独立webapp呢?这样,只要你的webapp不能正常启动,嵌入的服务器也会关闭。
对我来说,看起来你专注于ServletContextListener是为了解决一个问题,而这个问题并不是ServletContextListener的目的。
不要使用System.exit(),因为它会杀死可能正在运行其他部署的应用程序的服务器。如果因为你知道永远不会有其他应用程序(而且你不想)而没有问题,那么就创建一个独立的Web应用程序。这种糟糕的做法在CWE中被列为潜在的弱点:CWE-382
只是一个提示:Sping Boot 有助于构建带有嵌入式服务器的独立Web应用程序。请参阅此指南:https://spring.io/guides/gs/spring-boot/
很好的文章解释了为什么这可能是你正在寻找的:http://www.beyondjava.net/blog/application-servers-sort-of-dead/

相关问题