Не удалось выполнить веб-сокет. Переход на Comet и повторная отправка

Я использую платформу Atmosphere 2.0.0.RC5 для расширения своего веб-приложения с помощью функций веб-сокета и столкнулся с какой-то странной ошибкой «Ошибка веб-сокета. Переход на Comet и повторная отправка», от которой я не могу избавиться.

В качестве отправной точки я использовал пример веб-чата: https://github.com/Atmosphere/atmosphere-samples/tree/master/samples/websocket-chat

Приложение имеет клиент html+js и бэкэнд java.

Бэкэнд

  • Tomcat 7.0.42 с включенным протоколом NIO
  • Веб-модуль v3.0 с сервлетами Spring и Atmosphere
  • Пользовательский фильтр CORS, позволяющий заголовки атмосферы
  • Каждое полученное сообщение регистрируется сервером

(дополнительный код опущен)

public void onTextMessage(WebSocket webSocket, String message) throws IOException {
    logger.info("Message received: " + message);
    webSocket.broadcast(mapper.writeValueAsString(mapper.readValue(message, Data.class)));
}

Клиент

index.html

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="js/lib/jquery.atmosphere-2.0.2.js"></script>
<script type="text/javascript" src="js/aimpl.js"></script>

aimpl.js

$(function() {
    "use strict";
    var socket = $.atmosphere;

    var request = {
        url: 'http://localhost:8181/services/echo',
        transport: "websocket",
        contentType: "application/json",
        //connectTimeout: '300000',
        fallbackTransport: 'long-polling',
        enableXDR: true,
        logLevel: 'debug'
    };

    request.onMessage = function (response) {
        console.log(response.responseBody)
    };

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

    request.onReconnect = function (request, response) {
        console.log("reconnecting...");
    };

    request.onError = function(response) {
        console.log('an error has occured.');
    };

    var channel = socket.subscribe(request);
    channel.push(JSON.stringify({ author: 'me', message: 'hello from websocket!' }));
});

Когда я открываю index.html, я вижу ошибку в консоли (jquery.atmosphere-2.0.2.js, строка 1097) и никаких сообщений в журнале сервера:

Uncaught TypeError: невозможно установить для свойства 'webSocketOpened' значение null

Удивительно, но это работает, когда я набираю прямо в консоли:

Атмосфера, подключенная через веб-сокет

И регистрируется сервером, поэтому я предполагаю, что серверная часть в порядке:

Зарегистрировано сервером

Я предполагаю, что это проблема с javascript, но я не уверен на 100%. Я играл с параметром connectTimeout безуспешно. Любые идеи, почему это не работает в сценарии?


person Evgeny Tugarev    schedule 12.09.2013    source источник
comment
transport: "websocket",, у вас 2х ,,   -  person zer02    schedule 13.09.2013
comment
опечатка, извините, исправил.   -  person Evgeny Tugarev    schedule 13.09.2013
comment
Может быть, попробовать использовать аннотацию по умолчанию и посмотреть, работает ли она? var request = new $.atmosphere.AtmosphereRequest(); request.url = 'http://localhost:8181/services/echo'; и т. д..   -  person zer02    schedule 13.09.2013


Ответы (1)


Переместите код channel.push внутрь функции onOpen.

Сообщение об ошибке является результатом попытки отправить данные до того, как соединение было установлено. Подробнее здесь

person Community    schedule 21.01.2014