我可以找到很多关于Long Polling如何工作的信息(例如,这个和这个),但没有关于如何在代码中实现它的简单示例。
基本上,我如何使用Apache Tomcat来处理请求,以及如何编写一个简单的应用程序(spring),它会对服务器进行“长时间轮询”以获取新消息?
该示例不必是可扩展的,安全的或完整的,它只需要工作! 如果有人能给我这样的教程或推荐任何其他教程,我将不胜感激。
答案 0 :(得分:3)
这是我能提出的最简单的例子......
在控制器中:
@RequestMapping("/longPolling")
public String longPolling(Model model) {
while(true) {
// .. Do something, break when done...
if( somethingIsDone ) {
break;
}
}
return "someResponse";
}
在调用此方法的视图中,您将设置ajax调用,并且在超时时只需再次调用它。长轮询的想法是服务器只有在有回应的情况下才会响应。
如果您使用的是Spring 3.2,更好的方法是使用DeferredResult 或者从处理程序方法返回Callable。如果你是Spring 3.2之前的版本,那么你可以使用几个框架来帮助它们,比如Atmosphere,它可以很好地与Spring一起工作。有些甚至还有JavaScript部分来简化客户端编码。
答案 1 :(得分:0)
基于已经存在的anwser,使用Servlet 3 API(Tomcat 7)和Spring 3.2附带的新东西进行更有效的“长轮询”变体
@RequestMapping("/longPolling")
public Future<String> longPolling(Model model) {
return callSomethingWhereAFutureReturns();
}
重点是:未来只是未来结果的“指针”(字面意思不是)。因此,在处理上述代码后,无论何时解决,将暂停/退出此请求的调度线程。当未来得到解决时,/ a线程将被重新附加并返回实际结果(在本例中为字符串)。但想想“Spring”,这也可能是一个转换为JSON的POJO。
只有未来的结果将由另一个线程解决时,这才有意义。在聊天应用程序中,这将是带有新消息(不推荐)的另一个请求线程或专用调度程序线程(更好)。