java - 长时间关机时如何处理servlet请求

标签 java servlets

我们需要在我们的 Servlet 应用程序中实现一个优雅的关闭机制。

编辑:我们想让它尽可能简单,这将处理通过操作系统函数发送的终止信号。这将允许系统管理员使用内置的 shell 实用程序(Windows 上的 kill 或 taskkill),否则他们将不得不安装另一个实用程序来与服务器“对话”。

这个机制分两个阶段工作:

  1. 根据关闭请求,拒绝某些关键 Activity
  2. 阻塞,直到先前启动的关键操作完成;这些可能需要几个小时

第一阶段在我们的 DAO 层中实现。 阶段 #2 在我们的 ServletContextListener#contextDestroyed 方法中实现

我们的问题是,一旦调用 contextDestroyed,Servlet 容器就会停止为进一步的 HTTP 请求提供服务。

编辑:当有人在服务器进程上调用操作系统的 kill 函数时调用 contextDestroyed。

我们想让应用程序在第 2 阶段保持 Activity 状态,通知用户某些 Activity 不可用。

最佳答案

使用 filter保留所有关键请求的列表。

当收到“准备关闭”请求时,过滤器应该开始拒绝一些请求。

编写一个 servlet,告诉您还有多少关键作业留在队列中。

在关机工具中,发送“准备关机”。轮询 servlet 以了解关键作业的数量。当它达到 0 时,发送实际的关机命令。

要实现这一点,请在业务层中创建一个服务来协调这一点。请注意,所有事情都必须在 contextDestroyed() 被调用之前发生!您的特殊应用程序关闭不符合 J2EE 世界观,因此您必须自己管理它。

该服务应该能够告诉感兴趣的各方何时正在关闭、有多少关键作业仍在运行等。然后 Servlet 和过滤器可以使用该服务来拒绝请求或告诉还有多少作业剩余。

当所有工作完成后,拒绝除访问“关闭信息”servlet 之外的所有请求,该 servlet 应该告诉应用程序现在已准备好停止运行。

编写一个工具,为管理员提供一个漂亮的 UI 来启动关闭您的应用程序。

[编辑] 您可能想阻止操作系统关闭您的应用程序。 不要那样做。

你应该做的是编写一个特殊的工具来使用我上面描述的两阶段过程关闭你的应用程序。这应该是标准的关机方式。

是的,管理员会提示的。在 Unix 上,您可以通过将其放入 init 脚本来隐藏此工具,这样就不会有人注意到。 Windows 上可能有类似的解决方案。

杀死服务器应该总是能够在(意外)意外情况下停止它,例如:关闭代码中的错误,电源故障期间的紧急关闭,应用程序代码中的错误,或者墨菲发生时。

关于java - 长时间关机时如何处理servlet请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444384/

相关文章:

java - 使用 Spring :eval display property value in jsp

java - 从 JSP 页面中的 servlet 调用方法,使用该 JSP 页面中的参数的方法

Eclipse TCP/IP Monitor 有两个端口

按钮的 Javafx 背景图像不起作用

java - 如何捕获Android应用程序关闭

Java流: iterate two collections,链接响应

java - 我想从 firebase 存储中检索视频

java - 如何使用@RequestBody 调用@RestController?

java - 在提交类型的帖子上调用 doget,反之亦然

java - 未找到具有 URI SpringMVC Rest APi 的 HTTP 请求的映射