如何在Tomcat中优雅地终止长查询REST请求

时间:2017-09-11 19:06:50

标签: tomcat servlets

故事是,我们有一个由Tomcat + Apache Httpd托管的webapp作为前端。 webapp需要很长时间来处理某些REST请求(长时间查询数据库,然后在获得数据库响应后生成摘要)。

在当前实现下,即使REST客户端停止请求,查询仍在处理中,直到数据库查询完成并尝试回发响应并发现输出流已关闭。另一方面,webapp不会在很长时间内发回任何内容,导致Apache Httpd会话超时(我们将超时配置为5分钟)。

那么实现以下目标的最佳做法是什么:

  • 如果客户端终止请求,我希望处理请求停止,并且对数据库的查询也会终止。

  • 如果请求尚未被客户端终止但是查询已经花费很长时间,则Tomcat可以发回过早响应。

    更新:我认为服务器可能会继续发回100,但我错了。看起来像100继续不打算用于那个目的。

我正在考虑这样的模型:

  • 引入servlet过滤器以接受REST请求。
  • 过滤器创建另一个线程,以异步方式调用目标REST,提供输出流。
  • 过滤器会定期进行一些休眠并检查新线程的输出流,并不时向后发送100,或将结果从输出流传输到客户端。

这是可行的还是其他更好的方法?

1 个答案:

答案 0 :(得分:2)

长时间运行请求的另一种方法是让服务器将301重定向返回到URL,在该URL处,服务器处理完成后将发布请求输出。然后,客户端可以获取此URL以检查请求的状态。

This 2011 post by Thijssen描述了一种异步Web请求的RESTful方法(使用202和303 HTTP状态代码),这种方法更优雅,但在一天结束时,您需要Web客户端和服务器注意细节;我不知道任何一个普遍支持的标准来处理长时间运行的REST API调用。