如何使用持久的http请求

时间:2013-05-14 11:39:37

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

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

目前它全部是同步的,而在服务器计算机上,浏览器看不到输出/结果。片刻之后,连接将被删除,并在浏览器中显示超时错误。

我想立即将一些信息返回给浏览器,并让它等待结果。怎么做到这一点?

请注意,Java后端是同步的。所以一个解决方案需要servlet /前端的一些 hack 可能需要javascript请求..?

3 个答案:

答案 0 :(得分:1)

您可能想要使用COMET模式。它就像AJAX模式,只有长期持有的HTTP请求来模拟一个feed。有关详细说明,请参阅here

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

这个时间序列让它感觉像是一个饲料。

在你的情况下,它可以立即返回“是的,我正在处理它”,然后回复“仍然处理10%完成花花公子”等等,直到你回来“完成”。

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

虽然,当您使用同步Java后端时,您可能需要在某处进行某种指示才能取得进展。可能是一个数据库。

答案 1 :(得分:1)

只要你向输出流写一些内容就不会发生超时(它甚至可以是空格,不要忘记调用flush())。

例如,当您打印一份大型报告时,这种持久的请求就会发生,该报告随后会在生成时显示给用户。

在所有其他情况下,将等待页面返回给用户并使用定期AJAX请求来询问处理是否已完成。如果没有任何变化且浏览器显示加载,则表示用户体验不佳。

答案 2 :(得分:0)

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