2011-05-07 67 views
3

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

回答

2

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

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

2

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

  1. 创建代表了一个独特的ID
  2. 的工作任务将作业发送到你的后台处理程序对象(即包含的遗嘱执行人)
  3. 建立唯一的作业ID的URL的工作。
  4. 返回描述那里他们可以得到的结果

页,结果将与这样的背景下作业管理器来协调页面。在计算时,您可以在此页面上描述进度。完成后,该页面可以显示长时间运行作业的结果。

4

您需要的是作业调度程序,因为他们保证即使在重新启动服务器时也能完成作业。

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