2013-03-26 23 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。

只有當未來的結果將被另一個線程解決時,這纔有意義。在聊天應用程序中,這將是另一個帶有新消息(不推薦)或專用調度程序線程(更好)的請求線程。