Атмосферные ответы, трансляции не вызывают javascript на обработчике сообщений

Я работаю с атмосферой, пытаясь получить простую базовую реализацию с использованием атмосферы 2.0.3 tomcat 7.0.42, работающей локально в моей среде затмения (также подключающейся с внешней машины, чтобы увидеть трафик с помощью wireshark). Проблема, с которой я сталкиваюсь, не имеет значения, какой транспорт я использую: websocket, sse, polling, long-polling, широковещательный ответ никогда не попадает к клиенту, а обработчик response.OnMessage никогда не вызывается. Я не получаю никаких исключений во время выполнения, и я попытался с Firefox/ Chrome/ и IE. Я также использовал wireshark, и после сообщения чата я вижу пакет, содержащий мой ответ на сообщение: "HTTP - продолжение или трафик не HTTP", и в данных пакета я вижу исходящее сообщение клиенту, поэтому Похоже, серверная сторона работает правильно. Начальное соединение с сервером установлено, и обработчик js onOpen вызывается, как и ожидалось.

Работа, которую я делаю, основана в основном на примере приложения чата с атмосферой. Если у кого-то есть предложения, я был бы признателен. Также стоит упомянуть, что я добавил в реальный обработчик чата страницу js и html из примера атмосферы, и он также не работает, и обработчик onMessage js в этом тоже не вызывается, так что я думаю, что это проблема конфигурации.

web.xml

<servlet>
    <description>AtmosphereServlet</description>
    <servlet-name>AtmosphereServlet</servlet-name>
    <servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
   <init-param>
        <param-name>o.a.useWebSocket</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useNative</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>AtmosphereServlet</servlet-name>
    <url-pattern>/chat/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>AtmosphereServlet</servlet-name>
    <url-pattern>/chatSample/*</url-pattern>
</servlet-mapping>

pom.xml

<dependency>
  <groupId>javax.activation</groupId>
  <artifactId>activation</artifactId>
  <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>org.atmosphere</groupId>
    <artifactId>atmosphere-compat-tomcat</artifactId>
    <version>1.0.15</version>
</dependency>
<dependency>
    <groupId>org.atmosphere</groupId>
    <artifactId>atmosphere-compat-tomcat7</artifactId>
    <version>1.0.15</version>
</dependency>
<dependency>
    <groupId>org.atmosphere</groupId>
    <artifactId>atmosphere-runtime</artifactId>
    <version>2.0.3</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.3</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.3</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>

Серверный код:

@AtmosphereHandlerService(path="/chat",
broadcasterCache = UUIDBroadcasterCache.class,
interceptors = { AtmosphereResourceLifecycleInterceptor.class,
                 BroadcastOnPostAtmosphereInterceptor.class,
                 HeartbeatInterceptor.class
               })
public class ChatController extends OnMessage<String> {

    private final ObjectMapper mapper = new ObjectMapper();

    @Override
    public void onMessage(AtmosphereResponse response, String message) throws IOException {
        response.write(mapper.writeValueAsString(mapper.readValue(message, Data.class)));
    }
}

Javascript на стороне клиента (был опробован с polling / long-polling / sse / websockets, и все они успешно подключились на начальном этапе и вызвали обработчик OnOpen после первоначального подключения:

var transport = 'long-polling';

var request = { url:'/Chat2/chat',
    contentType : "application/json",
    logLevel : 'debug',
    transport : transport,
    trackMessageLength : true,
    reconnectInterval : 5000,
    fallbackTransport: 'polling'};


request.onOpen = function(response) {
    console.log('OnOpen: Atmosphere connected using ' + response.transport );
    transport = response.transport;
};

request.onReopen = function(response) {
    console.log('OnReopen: connection reopened');
};


request.onTransportFailure = function(errorMsg, request) {
    atmosphere.util.info(errorMsg);
    if (window.EventSource) {
        request.fallbackTransport = "polling";
    }
    console.log('OnTransportFailure: Atmosphere Chat. Default transport is WebSocket, fallback is ' + request.fallbackTransport);
};

request.onMessage = function (response) {
    alert('OnMessage: message received');
};

request.onClose = function(response) {
    console.log('OnClose: Client closed the connection after a timeout');
    subSocket.push(atmosphere.util.stringifyJSON({ author: author, message: 'disconnecting' }));
};

request.onError = function(response) {
    console.log('OnError: error occurred');
    console.log(response);
    logged = false;
};

request.onReconnect = function(request, response) {
    console.log('OnReconnect: Reconnected');
};

subSocket = socket.subscribe(request);

$('#chatSubmit').click(function() {
    var msg = $('#chatText').val();

    subSocket.push(atmosphere.util.stringifyJSON({ author: author, message: msg }));
    $('#chatText').val('');
});

1 ответ

Решение

Вы должны установить TrackMessageLengthInterceptor, если вы устанавливаете trackMessageLength: true на стороне клиента. Так что добавьте его в список перехватчиков вашего AtmosphereHandlerService.

- Жанфрансуа

Другие вопросы по тегам