2015-05-28 4 views
0

Я тестирую приложение чата, использующее инфраструктуру Atmosphere. Когда я подключаюсь к приложению из двух браузеров, все работает, как чат, должен работать с Tomcat 7.0 и Используется протокол Websockets.Длительный опрос с проблемой атмосферы с сервлетом 2.5

Когда я понижаюсь до Tomcat 6.0. или когда я использую Weblogic 10.3.6 используется длинный опрос (как и ожидалось). С одним браузером, беседующим с самим собой, все работает, но когда я открываю второй браузер, оба окна отключены.

Я установил уровень журнала для отслеживания и, кажется, что атмосфера добавляет каждый AtmosphereResource с тем же UUID набор 10000:

TRACE [http-8080-6] o.a.c.DefaultAtmosphereResourceFactory [DefaultAtmosphereResourceFactory.java:309] Adding: AtmosphereResource{ uuid=10000, transport=LONG_POLLING, isInScope=true, isResumed=false, isCancelled=false, isSuspended=true, broadcasters=/chat, isClosedByClient=false, isClosedByApplication=false, action=Action{timeout=-1, type=SUSPEND}}

Мой Chat.java класс:

@AtmosphereHandlerService(path = "/chat", 
broadcasterCache = UUIDBroadcasterCache.class, 
       interceptors = { 
         AtmosphereResourceLifecycleInterceptor.class, 
         BroadcastOnPostAtmosphereInterceptor.class, 
         SuspendTrackerInterceptor.class, 
         HeartbeatInterceptor.class 
       }, 
       broadcaster = SimpleBroadcaster.class 
     ) 
     public class Chat extends OnMessage<String> { 
      private final Logger logger = LoggerFactory.getLogger(Chat.class); 
      private final JacksonDecoder decoder = new JacksonDecoder(); 
      private final JacksonEncoder encoder = new JacksonEncoder(); 


     @Override 
     public void onMessage(AtmosphereResponse response, String message) throws IOException { 
      Message mes = decoder.decode(message); 
      logger.info("{} just send {}", mes.getAuthor(), mes.getMessage()); 
      response.write(encoder.encode(mes)); 
     } 

Я использую Атмосфера версии 2.3.1. К сожалению, мне нужен длительный опрос, потому что там Weblogic 10.3.6. установленный на нашем производственном сервере и не поддерживает Websocket и имеет реализацию Servlet 2.5. только.

Edit:

Похоже, что во время первого запроса GET на сервер, сервер установит UUID для данного AtmosphereRequest и возвращает его на сервер с заголовком HTTP

X-Atmosphere-tracking-id = someUUID

, но в последующих рекомендациях клиент не использует его. Он посылает на сервер

X-атмосфера-отслеживания идентификатор = 10000

Не уверен, если это правильно ...

ответ

0

Через некоторое debuggin я был в состоянии решить эту проблему.

Проблема заключалась в том, что в моем application.js библиотеке я использую

trackMessageLength: истинный

в объекте запроса, но не было никакого TrackMessageSize перехватчик определена.

Atmosphere.js библиотека анализировала следующий массив и вместо 1. значение принимала 2.value и устанавливала его как UUID.

["0af719e9-4776-4af1-9925-19c2bb10b547", "10000", "X", ""]