Java 关闭/从Servlet取消部署tomcat

Java 关闭/从Servlet取消部署tomcat,java,tomcat,shutdown,Java,Tomcat,Shutdown,我在Tomcat中有一个initservlet,用于加载关键数据。有时有必要在出现某些错误时中止启动 如何在不调用System.exit(1) 我希望避免通过端口调用shutdown servlet,因为在我的安装中没有配置该端口 可能有一些任务需要在web.xml中定义的关机时从侦听器运行首先,您永远不应该从servlet容器中调用System.exit(),因为可能有其他应用程序在与您相同的进程中运行,而强行扼杀整个过程是非常不正确的 假设您的“init servlet”实现了Servlet

我在Tomcat中有一个initservlet,用于加载关键数据。有时有必要在出现某些错误时中止启动

如何在不调用
System.exit(1)

我希望避免通过端口调用shutdown servlet,因为在我的安装中没有配置该端口


可能有一些任务需要在web.xml中定义的关机时从侦听器运行首先,您永远不应该从servlet容器中调用
System.exit()
,因为可能有其他应用程序在与您相同的进程中运行,而强行扼杀整个过程是非常不正确的

假设您的“init servlet”实现了
ServletContextListener
,那么在API/接口中没有定义正式的方式来向servlet容器发出信号“请关闭应用程序”。但是,您可以从
contextInitialized()
方法抛出某种
RuntimeException
,在大多数容器(至少是Tomcat)中,该方法将停止webapp的启动,并使其处于“stopped”状态。然而,我怀疑Tomcat是否会继续调用您的关机侦听器


您可能需要重新考虑您的设计,这样您的关键数据/关闭逻辑就不会与servlet容器的生命周期紧密相连。

我添加的是一个healthcheck探测器,它将使用
curl检查服务器是否仍在运行。
我认为可以修改它以检查是否存在“标志”文件。我只发送了一个
catalina.sh stop
命令

如果这是一个Docker容器,您可以使用healthcheck探针让它自己关闭


理想情况下,如果您可以迁移到Spring Boot之类的程序,该程序运行tomcat,但如果Spring上下文加载不正确,则会终止它。

更多内容是关闭实用程序线程并正确写入日志,用于与内存一直不足的坏应用程序共享tomcat。当我检测到这一点时,我调用System.exit(0)。关闭与Tomcat中的其他方法一样优雅。如果您得到OOM,那么此时除了关闭JVM之外别无选择。如果您遇到内存不足错误,您应该修复错误的servlet,而不是养成用
系统崩溃服务器的习惯。退出
。一个澄清:您的
ServletContextListener
的实现不需要是一个servlet,它可以是一个实现两个方法接口的POJO类。顺便说一句,现在让Servlet容器识别、加载和执行侦听器最简单的方法就是简单地使用注释。这样的监听器是用于执行web应用程序的设置和拆卸的钩子,保证在第一次/最后一次servlet调用之前/之后运行。