我有一个实现ServletContextListener
的类,它在启动时加载一些资源。
当我的逻辑中出现一些不良事件时,这些资源对于我希望在整个启动时失败的方式对应用程序至关重要。
我是否可以从ServletContextListener.contextInitialized()
方法中执行任何命令来停止和失败整个Tomcat启动?
答案 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) {
}
}
您可以使用decorator模式来包装现有的侦听器,而不会使它们混乱。不确定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/