【问题标题】:How to work with long-lasting http requests如何处理持久的 http 请求
【发布时间】:2013-05-14 19:57:43
【问题描述】:

我有一个持久的 http 请求(后端有很多计算)。

目前它都是同步的,而服务器计算机,浏览器看不到输出/结果。一段时间后,连接断开,浏览器中显示超时错误。

我想立即向浏览器返回一些信息,并让它等待结果。如何做到这一点?

请注意,Java 后端是同步的。因此,解决方案需要在 servlet/前端进行一些 hack,可能需要 javascript 请求.. ?

【问题讨论】:

    标签: java javascript spring-mvc asynchronous long-polling


    【解决方案1】:

    您可能想要使用 COMET 模式。它类似于 AJAX 模式,仅具有用于模拟提要的长期 HTTP 请求。详细解释见here

    基本上,您发出一个请求,服务器持有它,然后在它有兴趣时回复。在收到回复时,您立即发出另一个长期存在的请求。

    这个时间序列让人感觉像是一个提要。

    在您的情况下,它可以立即返回“是的,我正在处理它”,然后回复“仍在处理 10% 已完成”,依此类推,直到您返回“完成”。

    像 node.js 这样的东西非常擅长实现这种功能。

    尽管您使用的是同步 Java 后端,但您可能需要某种指示某处正在取得进展。可能是一个数据库。

    【讨论】:

      【解决方案2】:

      只要你写东西到输出流就不会发生超时(它甚至可以是空格,不要忘记调用flush())。

      当您打印一个大型报告时,这种持久的请求才有意义,该报告随后会在生成时显示给用户。

      在所有其他情况下,将等待页面返回给用户并使用定期 AJAX 请求询问处理是否完成。当没有任何变化并且浏览器显示正在加载时,这不是一个好的用户体验。

      【讨论】:

        【解决方案3】:

        最好的解决方案是使用 AJAX 请求。一旦 ajax 请求超时,您可以使用 JavaScript 再次发送它(您可以显示一些按钮)。这可能是处理超时的最佳做法。

        【讨论】:

        • 第一个请求必须是同步调用(我发送一个html表单)。
        • @RoaySpol 您可以随时等待您的 AJAX 请求完成
        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 2010-12-08
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-11
        • 1970-01-01
        相关资源
        最近更新 更多