5

我在 Tomcat 中有一个加载关键数据的初始化 servlet。有时有必要在某些错误中中止启动。

我如何在不调用的情况下优雅地关闭已部署的应用程序/整个应用程序服务器System.exit(1)

我想避免通过端口调用关闭 servlet,因为我的安装中没有配置它。

可能有一些任务需要在 web.xml 中定义的关闭时从侦听器运行

4

2 回答 2

7

首先,你永远不应该System.exit()从 servlet 容器中调用,因为可能有其他应用程序在与你的进程相同的进程中运行,并且强行终止整个进程是非常不正确的。

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

您可能需要重新考虑您的设计,以便您的关键数据/关闭逻辑不会与 servlet 容器的生命周期如此紧密地联系在一起。

于 2009-10-08T12:48:18.610 回答
0

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

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

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

于 2020-09-22T11:50:34.483 回答