在Servlet中进行线程化

时间:2011-05-07 17:13:54

标签: java multithreading servlets

我正在研究一个可能需要几个小时才能完成请求的servlet。但是,调用servlet的客户端只对知道servlet是否已收到请求感兴趣。客户端不希望等待几小时才能从servlet获得任何响应。此外,由于调用servlet是一个阻塞调用,因此客户端在收到来自servlet的响应之前无法继续。 为了避免这种情况,我想在servlet代码中实际启动一个新线程。 servlet启动的线程将执行耗时的处理,允许servlet非常快速地向客户端返回响应。但我不确定这是否是一种可以解决servlet调用阻塞性质的可接受方式。我已经研究过NIO,但似乎并不能保证在任何servlet容器中工作,因为servlet容器也是基于NIO的。

3 个答案:

答案 0 :(得分:4)

您需要的是作业调度程序,因为它们可以确保即使服务器重新启动也可以完成作业。

查看java OSS job schedulers,最值得注意的是Quartz

答案 1 :(得分:2)

您的解决方案是正确的,但在企业应用程序中创建线程被认为是一种不好的做法。最好使用thread pool或JMS队列。

你必须考虑到服务器在处理期间会发生什么情况,如何在多个请求(想想:数百甚至数千)同时发生时做出反应,等等。所以你选择了正确的方向,但它有点复杂。

答案 2 :(得分:2)

一个线程并不错,但我建议把它作为一个任务放到执行程序池中。更好的是长期工作的经理。像你计划的那样快速返回并不是一种坏习惯。我建议提供某种用户反馈,指示用户可以在哪里找到有关长时间运行作业的信息。所以:

  1. 使用唯一ID
  2. 创建代表工作任务的作业
  3. 将作业发送到后台处理程序对象(包含执行程序)
  4. 为唯一的作业ID构建网址。
  5. 返回描述他们可以获得结果的页面
  6. 包含结果的页面必须与此后台作业管理器协调。在计算时,您可以让此页面描述进度。完成后,页面可以显示长时间运行的作业的结果。