2013-03-26 41 views
5

我可以找到很多有关长轮询如何工作的信息(例如,这个和这个),但没有简单的例子来说明如何在代码中实现它。春季长码示例代码?

基本上,我将如何使用Apache Tomcat来为请求提供服务,以及如何编写一个简单的应用程序(spring)来“长期轮询”服务器以查找新消息?

该示例不必是可缩放的,安全的或完整的,它只需要工作! 我会很感激,如果任何人都可以给我这样的教程或转介任何其他。

回答

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

DeferredResult是一个Spring 3.2的补充,允许您将创建的DeferredResult传递给一个单独的进程。 Callable是一个Java类,类似于Runnable。它更难以实现Callable,以允许单独的流程来处理响应,尽管并非不可能。这里是一个相当体面的博客如何让DeferredResult工作:http://blog.springsource.org/2012/05/13/spring-mvc-3-2-preview-adding-long-polling-to-an-existing -Web应用程序/ – CodeChimp 2013-03-27 11:44:41

0

基于已有的anwser,更effecient“长轮询”变种使用新的东西,从Servlet 3 API(Tomcat的7)和春天来3.2

@RequestMapping("/longPolling") 
public Future<String> longPolling(Model model) { 
    return callSomethingWhereAFutureReturns(); 
} 

的一点是:未来是唯一“指针”(不要从字面上理解)到未来的结果。因此,无论何时解决未来,处理上述代码后,此请求的调度线程将被暂停/退出。当未来解决时,/ a线程将被重新连接并返回实际结果(在本例中为字符串)。但认为“春天”,这也可能是POJO转换为JSON。

只有当未来的结果将被另一个线程解决时,这才有意义。在聊天应用程序中,这将是另一个带有新消息(不推荐)或专用调度程序线程(更好)的请求线程。