【问题标题】:Keeping a web request alive保持 Web 请求处于活动状态
【发布时间】:2010-04-16 05:56:38
【问题描述】:

我有一个网络应用程序,可以帮助下载报告。 但是报表生成有时会花费很多时间,并且Web请求通过中间代理服务器超时。(超时:90秒)。 下载报告的工作流程很简单。客户端向 Web 服务器发送请求。 Web 服务器生成报告,并将其作为 Excel 下载提供给客户端。
使用 POI 生成 Excel,并使用 Spring 的 AbstractExcelView 提供下载。
保持网络请求活动的最佳方法是什么(当然不增加超时)?

【问题讨论】:

    标签: web-applications request keep-alive


    【解决方案1】:

    一种方法是让初始请求返回一个等待屏幕,上面写着“我们正在生成报告...”,其中包括一个请求令牌和 JavaScript(通常是 AJAX),以便定期将该请求令牌传回 Web 应用程序以查看报告是否完成,并在完成时显示。

    如果您在 Web 应用程序代码中对报告的进度有任何指示,则也可以通过 AJAX 传达该进度。

    这样每个请求都会在相当短的时间内得到答复,但报告生成“会话”通过令牌 ID 保持活动状态。当报告在服务器上完成时,您可能希望将其存储在某个缓存中,直到它被请求 - 并在一段时间后使其过期,以防浏览器已关闭。

    哦,还有一个我之前没有提到的很好的副作用——用户可以看到网络应用仍然存在,并且他们仍然有网络连接到它。让光标旋转几分钟可能会令人不安:)

    【讨论】:

    • 你也可以让服务器端处理“我们完成了吗?”在放弃之前呼叫等待最多 N 秒。如果命令完成,它将立即返回“是的,完成”。如果 N 秒过去了没有完成,它返回“no, still busy”。所以客户端必须反复轮询,但他们只需要每 N 秒启动一个新连接,他们就可以毫不拖延地获得完成事件。此外,如果 N 足够大,大多数客户端都不必轮询。 (如果它太大,你会遇到网络服务器的硬超时)。这就像轮询和适当的事件通知之间的交叉。
    【解决方案2】:

    您是否尝试过使用支持 COMET 的服务器?您可以通过使用各种技术(如 COMET 甚至长轮询)来保持长时间运行的请求。或者对服务器进行简单的 AJAX 实时 ping 就可以解决问题。当您知道报告已生成时,使用 Ajax 重新加载页面。

    【讨论】:

      猜你喜欢
      • 2016-03-23
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2014-11-16
      • 2012-05-24
      相关资源
      最近更新 更多