2011-11-14 92 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个专业版的电话:)