Tomcat中长时间运行的操作

时间:2009-10-12 17:52:18

标签: tomcat

是否有任何建议的做法可以在Tomcat中实现长时间运行的操作?

e.g。在操作完成之前运行操作并不产生响应会更好吗?或者最好立即返回某种可用于轮询完成的票? (有没有办法通知客户已完成发生?)

3 个答案:

答案 0 :(得分:2)

为了让您的服务器不会摔倒,并且为了不让用户感到沮丧,最好立即按照您的建议返回某种“票”,然后定期轮询完成那张票。

如果这是非常长时间运行的操作,您可以考虑发送电子邮件(例如Vimeo会在重新编码您的视频时执行此操作)。

答案 1 :(得分:2)

您应立即返回状态为202 Accepted。除此之外,HTTP规范同意Jonathan's answer

  

使用此响应返回的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某些估计。

您可以使用以下方式设置状态(例如,在servlet中)

response.setStatus(HttpServletResponse.SC_ACCEPTED);

其中response是为请求提供的HttpServletResponse

修改(重新:评论):

优秀的浏览器会将任何2XX状态视为成功,并将响应正文中提供的内容呈现给用户,因此返回202不应影响Web浏览器用户以及他们如何查看页面。如果浏览器没有执行此操作,则可能违反规范的Section 6.1.1

  

...应用程序必须理解任何状态代码的类,如第一个数字所示,并将任何无法识别的响应视为等同于该类的x00状态代码...

由于Tomcat服务器只是一个专门的HTTP服务器,您应该尽可能地坚持使用规范(即尽可能地返回状态)。即使您打算通过浏览器访问您的站点,也没有什么能阻止其他客户端(curl等)请求页面。如果您提供特定的状态,客户可以更恰当地采取行动。

答案 2 :(得分:1)

取决于您的操作执行时间。我根据情况使用这两种方法。我有一个普通浏览器的servlet,等待几秒钟,一切正常,但另一个用于从PDA访问的servlet在超时超时失败,我将返回响应imm。将请求放入队列后。 总而言之,我认为总的来说第二种方式更好。