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

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

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

该机制分两个阶段进行:

  • 在关闭请求时,拒绝某些关键活动
  • 阻止直到先前启动的关键动作完成; 这些可能需要几个小时
  • 阶段#1在我们的DAO层中实现。 阶段#2在我们的ServletContextListener#contextDestroyed方法中实现

    我们的问题是,一旦调用contextDestroyed,Servlet容器将停止服务更多的HTTP请求。

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

    我们希望在阶段2中让应用程序保持活动状态,通知用户某些活动不可用。


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

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

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

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

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

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

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

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

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

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

    是的,管理员会抱怨。 在Unix上,你可以通过把它放到init脚本中隐藏这个工具,所以没有人会注意到。 Windows上可能有类似的解决方案。

    如果发生(不)预期的情况,例如:关机代码中的错误,断电期间的紧急关机,应用程序代码中的错误或Murphy发生时,终止服务器应该可以停止服务器。

    链接地址: http://www.djcxy.com/p/73855.html

    上一篇: How to process servlet requests during long shutdown

    下一篇: Image deblurring on Matlab