【发布时间】:2013-08-26 12:42:15
【问题描述】:
我们需要在我们的 Servlet 应用程序中实现一个优雅的关闭机制。
编辑:我们想让它尽可能简单,这将处理通过操作系统函数发送的终止信号。这将允许系统管理员使用内置的 shell 实用程序(Windows 上的 kill 或 taskkill),否则他们必须安装另一个实用程序才能与服务器“对话”。
这种机制分两个阶段发挥作用:
- 根据关闭请求,拒绝某些关键活动
- 阻止,直到之前启动的关键操作完成;这些可能需要几个小时
阶段 #1 在我们的 DAO 层中实现。 阶段 #2 在我们的 ServletContextListener#contextDestroyed 方法中实现
我们的问题是,一旦 contextDestroyed 被调用,Servlet 容器就会停止为进一步的 HTTP 请求提供服务。
编辑:当有人在服务器进程上调用操作系统的 kill 函数时调用 contextDestroyed。
我们希望在第 2 阶段期间让应用程序处于活动状态,通知用户某些活动不可用。
【问题讨论】:
-
好问题。如果要拒绝的活动在特定的 servlet 中实现,如果数据库查找表明正在进行关闭,您总是可以让这些(并且只有这些)返回 4xx 范围内的状态?
-
有些活动是由 UI 操作发起的,有些是由调度程序发起的——这就是我考虑在 DAO 层控制它们的原因。