2011-11-14 56 views
2

我成功地做出了一個簡單而小巧的例子,它集成了Spring MVC和Atmosphere框架。它工作得很好,但它的行爲方式我不明白:大氣與Spring MVC框架的集成:

在我的嘗試示例中,我試圖廣泛每隔10秒廣播Date字符串,所以如果我在10:10:20啓動我的應用程序,下一條消息將是10:10:30等....

但代替它我在這段時間內有4個回調,所以我的消息流如下所示:10:10:20,10:10: 21,10:10:22,10:24,10:30。這種行爲會以相同的時間間隔順序發生:

爲什麼我在10秒內有4次回調,而不是每10秒鐘有一次回調?

我的相關代碼:

@RequestMapping(value="/websockets", method=RequestMethod.GET) 
@ResponseBody 
public void websockets(final AtmosphereResource<HttpServletRequest,HttpServletResponse> event) { 

     final HttpServletRequest req = event.getRequest(); 
     final HttpServletResponse res = event.getResponse(); 
     event.suspend(); 

     final Broadcaster bc = event.getBroadcaster(); 
     bc.scheduleFixedBroadcast(new Callable<String>() { 

      public String call() throws Exception { 

       return (new Date()).toString(); 
      } 
     }, 10, TimeUnit.SECONDS); 
} 

,並在我的客戶端代碼我做了以下內容:

<script type="text/javascript"> 
$(document).ready(function() { 
    var callbackAdded = false; 

      function callback(response) 
      { 

       $.atmosphere.log('info', ["response.state: " + response.state]); 
       $.atmosphere.log('info', ["response.transport: " + response.transport]); 

       if (response.transport != 'polling' && response.state != 'connected' && response.state != 'closed') { 
        $.atmosphere.log('info', ["response.responseBody: " + response.responseBody]); 
        if (response.status == 200) { 
         var data = response.responseBody; 

         if (data) { 
          $("#date").text(data); 
         } 
        } 
       } 
      } 
      $.atmosphere.subscribe("websockets", 
        !callbackAdded? callback : null, 
      $.atmosphere.request = {transport: 'websocket'}); 
      connectedEndpoint = $.atmosphere.response; 
      callbackAdded = true; 
}); 
</script> 

回答

1

增加非阻塞支持,我從網上收到以下消息後應用程序:

60347 [http-nio-8080-exec-1] WARN org.atmosphere.cpr.AtmosphereServlet - failed 
using comet support: org.atmosphere.container.TomcatCometSupport, error: Tomcat 
failed to detect this is a Comet application because context.xml is missing or t 
he Http11NioProtocol Connector is not enabled. 
If that's not the case, you can also remove META-INF/context.xml and WEB-INF/lib 
/atmosphere-compat-tomcat.jar 
60348 [http-nio-8080-exec-1] WARN org.atmosphere.cpr.AtmosphereServlet - Using B 
lockingIOCometSupport. 
60401 [http-nio-8080-exec-1] INFO com.hillert.atmosphere.HomeController - Welcom 
e home! 

並且在此消息之後,我得到像以前一樣的超時錯誤。 您可以從日誌中看到服務器正在使用http-nio-8080。 現在我該怎麼做?

+0

問題是:我的web服務器運行在代理之後。我正在使用System.setProperty(「http.proxyHost」,「代理」); System.setProperty(「http.proxyPort」,「80」);設置代理。現在,即使瀏覽器無法顯示來自Web服務器的信息,它也能正常工作。 – vasim

+0

嗨,我是新的氣氛。我想在Spring 3中實現氛圍。我不知道如何配置它。春季3沒有任何適當的配置氛圍指導。我已經在客戶端實現了atmospehere的控制器方法和jquery,就像你一樣。現在它顯示類似org.springframework.beans.BeanInstantiationException的錯誤:無法實例化bean類[org.atmosphere.cpr.AtmosphereResource]:指定的類是一個接口。如果你能幫我配置它。 –

+0

我不知道如何配置web.xml和spring-servlet.xml來配置氣氛。我有同樣的要求(在網頁上顯示每5秒鐘的時間),因爲你有。 –

0

我知道這個代碼有什麼問題。 開始廣播的每個請求線程每10秒會播放一次您的日期。 每當你發送一個新的請求(啓動一個新的瀏覽器),一個新的線程將開始。 不幸的是,線程永遠不會停止。 我不知道Atmosphere如何處理這種情況。 誰負責停止brodcast線程。 我會閱讀更多關於此。 您可以輕鬆測試我說的話,重新啓動網絡服務器,只需啓動一個瀏覽器,您應該每10秒鐘只能看到一個呼叫。 在我的情況下,它的工作原理是這樣的。我開始第三個瀏覽器,然後我多次瀏覽器客戶端。 停止關閉瀏覽器客戶端後,Web服務器從不停止brodcast線程。

第二種情況是當真的而不是10秒的等待時間我只有1秒。 這個我只能用Tomcat很難再現,所以我在嘗試另一個Web服務器:JBOSS 7.0。 隨着JBOSS總是可重現的。如果您啓動第二個瀏覽器請求,則第一個問題仍然存在,那麼您可以獲得2個專業版的電話:)