2

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

在我的尝试示例中,我尝试Date每 10 秒广播一次字符串,所以如果我在 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);
 }

在我的客户端代码上,我正在执行以下操作:

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

2 回答 2

1

添加非阻塞支持后,我从 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。我现在该怎么办 ?

于 2011-11-23T09:50:24.767 回答
0

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

第二种情况是我只有 1 秒的等待时间,而不是 10 秒的等待时间。这我只能用 Tomcat 来重现,所以我尝试了另一个网络服务器:JBOSS 7.0。使用 JBOSS 总是可以重现的。如果您启动第二个浏览器请求,那么第一个问题仍然存在,然后您会收到 2 个电话 pro second :)。

于 2011-11-24T17:07:06.800 回答