我有一个类实现ServletContextListener
在启动时加载一些资源。
这些资源对应用程序至关重要,当我的逻辑中发生一些不良事件时,我希望整个启动失败。
我可以从ServletContextListener.contextInitialized()
方法内部执行任何命令来停止和失败整个 Tomcat 启动吗?
尝试指定:
-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会如何反应你......
如果您想停止 Tomcat,因为您的 webapp 部署失败,我假设您没有将其他应用程序部署到 tomcat。在这种情况下,为什么不将此应用程序构建为具有嵌入式 Tomcat/Jetty 的独立 Web 应用程序?这样,只要你的 webapp 没有正常启动,嵌入式服务器也会关闭。
对我来说,看起来你专注于ServletContextListener
解决一个不是ServletContextListener
本意的问题。
不要使用System.exit()
,因为它会杀死可能运行其他已部署应用程序的服务器。如果没关系,因为您知道永远不会有其他应用程序(并且您不想这样做),那么请制作一个独立的 webapp。这种不良做法在 CWE 中被列为潜在弱点:CWE-382
只是一个提示:spring boot 有助于构建带有嵌入式服务器的独立 webapp。请参阅本指南:https ://spring.io/guides/gs/spring-boot/
很好的文章解释了为什么这可能是您正在寻找的:http ://www.beyondjava.net/blog/application-servers-sort-of-dead/