加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:51:21 所属栏目:Java 来源:网络整理
导读:我们需要在Servlet应用程序中实现一个优雅的关闭机制. 编辑:我们希望尽可能简化,这将处理通过操作系统的功能发送的终止信号.这将允许系统管理员使用内置的shell实用程序(在Windows上执行kill或taskkill),否则他们必须安装另一个实用程序才能与服务器“对话
我们需要在Servlet应用程序中实现一个优雅的关闭机制.

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

该机制分两个阶段:

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

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

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

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

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

解决方法

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

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

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

在关机工具中,发送“准备关机”.对servlet进行轮询以获取关键作业的数量.当此值达到0时,发送实际的shutdown命令.

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

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

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

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

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

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

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

杀死服务器应始终能够在(非)预期情况下停止它,例如:关机代码中的错误,电源故障期间的紧急关机,应用程序代码中的错误或Murphy发生时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读