Jquery 与Spring MVC框架的大气集成:

Jquery 与Spring MVC框架的大气集成:,jquery,spring,spring-mvc,comet,atmosphere,Jquery,Spring,Spring Mvc,Comet,Atmosphere,我成功地制作了一个简单而小的示例,它集成了SpringMVC和Atmosphere框架。它工作得很好,但它的行为方式我无法理解: 在我的try示例中,我尝试每隔10秒使用broadcustDate字符串,因此如果我在10:10:20启动我的应用程序,下一条消息将是10:10:30,以此类推 但在这段时间内,我有4次回调,因此我的消息流如下所示:10:10:20、10:10:21、10:10:22、10:24、10:10:30。此行为在同一时间段内依次发生: 为什么我在10秒内有4次回调,而不是每

我成功地制作了一个简单而小的示例,它集成了SpringMVC和Atmosphere框架。它工作得很好,但它的行为方式我无法理解:

在我的try示例中,我尝试每隔10秒使用broadcust
Date
字符串,因此如果我在10:10:20启动我的应用程序,下一条消息将是10:10:30,以此类推

但在这段时间内,我有4次回调,因此我的消息流如下所示:10:10:20、10:10:21、10:10:22、10:24、10: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);
 }
@RequestMapping(value=“/websockets”,method=RequestMethod.GET)
@应答器
公共无效WebSocket(最终AtmosphereResource事件){
最终HttpServletRequest请求=event.getRequest();
最终HttpServletResponse res=event.getResponse();
suspend();
final-Broadcaster bc=event.getBroadcaster();
bc.scheduleFixedBroadcast(新的可调用(){
公共字符串调用()引发异常{
返回(新日期()).toString();
}
},10,时间单位为秒);
}
在我的客户端代码中,我正在执行以下操作:

<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>

$(文档).ready(函数(){
var callbackAdded=false;
函数回调(响应)
{
$.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]);
如果(response.status==200){
var数据=response.responseBody;
如果(数据){
$(“#日期”)。文本(数据);
}
}
}
}
$.atmosphere.subscribe(“websockets”,
!callbackAdded?回调:空,
$.atmosphere.request={transport:'websocket'});
connectedEndpoint=$.atmosphere.response;
callbackAdded=true;
});

添加非阻塞支持后,我从web应用程序收到以下消息:

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。
我现在该怎么办?

我知道你的代码有什么问题。 每个请求都会启动一个广播线程,每10秒广播一次您的日期。 每次发送新请求(启动新浏览器)时,都会启动一个新线程。 不幸的是,线程似乎永远不会停止。 我不知道大气是如何处理这种情况的。 谁负责停止brodcast线程。 我会读更多关于这方面的内容。 您可以简单地测试我所说的,重新启动web服务器,只需启动一个浏览器,您应该每10秒只看到一个调用。 就我而言,它是这样工作的。我启动第二个和第三个浏览器,然后我得到brodcast的次数与浏览器客户端的次数相同。 停止关闭浏览器客户端后,web服务器从未停止brodcast线程

第二种情况是,实际上我只有1秒的等待时间,而不是10秒的等待时间。 这一点我只能用Tomcat很难复制,所以我尝试了另一个web服务器:JBoss7.0。
使用JBOSS时总是可以复制的。第一个问题仍然存在,如果您启动第二个浏览器请求,则会接到两个电话(秒:)。

问题是:我的web服务器在代理后运行。我使用的是System.setProperty(“http.proxyHost”、“proxy”);System.setProperty(“http.proxyPort”、“80”);设置代理。现在,即使浏览器无法显示来自web服务器的信息,该示例也能正常工作。嗨,我是大气中的新手。我想在春季3实施大气。我不知道如何配置它。在春季3没有任何关于配置大气的正确指导。我已经在客户端实现了atmospehere的控制器方法和jquery,正如您所做的一样。现在它显示的错误类似于org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.atmosphere.cpr.AtmosphereResource]:指定的类是接口。我不知道如何配置web.xml和spring-servlet.xml来配置大气。我和你们有同样的要求(在网页上每5秒显示一次时间)。