Интеграция атмосферы со средой Spring MVC: - PullRequest
2 голосов
/ 15 ноября 2011

Мне удалось сделать простой и небольшой пример, который интегрируется между 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. Такое поведение происходит последовательно с тем же периодом времени:

Почему у меня 4 обратных вызова за 10 секунд вместо одного каждые 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>

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

После добавления поддержки неблокирования я получаю следующее сообщение из веб-приложения:

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 голосов
/ 24 ноября 2011

Я знаю, в чем проблема с этим вашим кодом. Каждый запрос с началом трансляции темы, что каждые 10 секунд будет транслировать вашу дату. Каждый раз, когда вы отправляете новый запрос (запускаете новый браузер), запускается новая тема. К сожалению, потоки никогда не остановятся. Я не знаю, как Атмосфера обрабатывает такие случаи. Кто ответит, чтобы остановить темы Brodcast. Я буду читать больше об этом. Вы можете легко проверить, что я сказал, перезапустить веб-сервер, просто запустить один браузер, и вы должны видеть только один звонок каждые 10 секунд. В моем случае это работает так. Я запускаю второй третий браузер, затем я получаю brodcast столько раз, сколько браузерных клиентов. После того, как я прекращаю закрывать клиенты браузера, веб-сервер никогда не останавливает потоки brodcast.

Второй случай, когда на самом деле вместо 10 секунд ожидания у меня была всего 1 секунда. Это я мог только жестко воспроизвести с Tomcat, поэтому я пробовал другой веб-сервер: JBOSS 7.0. С JBOSS было всегда воспроизводимо. Первые проблемы остаются, если вы запускаете второй запрос браузера, то вы получаете 2 звонка за секунду:).

...