gpt4 book ai didi

tomcat - 如何优雅地终止 Tomcat 中的长查询 REST 请求

转载 作者:行者123 更新时间:2023-11-28 22:11:00 24 4
gpt4 key购买 nike

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

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

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

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

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

    更新:我认为服务器可能会发回 100 继续,但我错了。看起来 100 continue 根本不是为了这个目的。

我在想这样的模型:

  • 引入一个 servelet 过滤器来接受 REST 请求。
  • 过滤器创建另一个线程来异步调用目标 REST,提供输出流。
  • 过滤器会定期休眠并检查新线程的输出流,并时不时发回 100 continue,或将输出流的结果流式传输到客户端。

这种方法可行吗?或者有其他更可取的方法吗?

最佳答案

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

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

关于tomcat - 如何优雅地终止 Tomcat 中的长查询 REST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com