如何在长时间关闭期间处理servlet请求

Adr*_*scu 7 java servlets

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

编辑:我们希望尽可能简化,这将处理通过操作系统的功能发送的终止信号.这将允许系统管理员使用内置的shell实用程序(在Windows上执行kill或taskkill),否则他们必须安装另一个实用程序才能与服务器"对话".

该机制分两个阶段:

  1. 在关机请求时,拒绝某些关键活动
  2. 阻止直到先前发起的关键行动完成; 这些可能需要几个小时

阶段#1在我们的DAO层中实现.阶段#2在我们的ServletContextListener#contextDestroyed方法中实现

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

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

我们希望在阶段#2期间让应用程序处于活动状态,通知用户某些活动不可用.

Aar*_*lla 5

使用过滤器保留所有关键请求的列表。

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

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

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

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

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

完成所有作业后,拒绝所有请求,除了对“关闭信息”servlet 的访问,然后该 servlet 应该告诉应用程序现在已准备好死亡。

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

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

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

是的,管理员会抱怨它。在 Unix 上,您可以通过将其放入 init 脚本来隐藏此工具,因此没有人会注意到。Windows 上可能有类似的解决方案。

杀死服务器应该总是可以在(非)预期情况下停止它,例如:关闭代码中的错误、电源故障期间的紧急关闭、应用程序代码中的错误或发生 Murphy 时。