Как заставить Atmosphere.js использовать предпочтительный транспорт при повторном подключении к Серверу?

Когда предпочтительный транспорт терпит неудачу, атмосфера пытается использовать запасной транспорт. Он пытался восстановить время maxReconnect. После этого он вызывает onClose и onError.

Когда я пытаюсь подписаться снова, Atmosphere всегда использует запасной транспорт для соединения.

Вот моя конфигурация клиента:

AtmosphereRequestConfig jsonRequestConfig = // ...
jsonRequestConfig.setTransport(AtmosphereRequestConfig.Transport.WEBSOCKET); 
jsonRequestConfig.setFallbackTransport(AtmosphereRequestConfig.Transport.LONG_POLLING);
jsonRequestConfig.setLogLevel("debug");
jsonRequestConfig.setMaxReconnectOnClose(1);
Atmosphere atmosphere = Atmosphere.create();
clientRequest = atmosphere.subscribe(jsonRequestConfig);

Когда мой сервер запущен и клиент подключается в первый раз (перезагрузка страницы), соединение выполняется через веб-сокеты. Затем я остановил свой сервер, клиент показывает это:

atmosphere.js:3252 Sat Jan 30 2016 22:17:14 GMT+0100 (CET) Atmosphere: websocket.onclose
atmosphere.js:3252 Websocket closed, reason: Normal closure; the connection successfully completed whatever purpose for which it was created. - wasClean: true
atmosphere.js:3252 Sat Jan 30 2016 22:17:14 GMT+0100 (CET) Atmosphere: Firing onClose (closed case)
ConsoleLogger.java:32 AtmosphereListener: onClose
atmosphere.js:3252 Sat Jan 30 2016 22:17:14 GMT+0100 (CET) Atmosphere: Request already closed, not firing onClose (closed case)
atmosphere.js:3252 Sat Jan 30 2016 22:17:14 GMT+0100 (CET) Atmosphere: invoking .close() on WebSocket object
atmosphere.js:3252 Sat Jan 30 2016 22:17:14 GMT+0100 (CET) Atmosphere: Firing onReconnect
ConsoleLogger.java:32 AtmosphereListener: onReconnect
atmosphere.js:3252 Sat Jan 30 2016 22:17:14 GMT+0100 (CET) Atmosphere: Firing onReconnect
atmosphere.js:3252 Invoking executeWebSocket, using URL: ws://www.example.com:8080/socket/widget/2418C3F0-9A9B-48C4-8EE3-0541465EEACD%7C%7Crefdgdfgwe324234%7C%7CAF8F7A67-CDD0-4AD3-96C4-D447E970D0F8?X-Atmosphere-tracking-id=f89f00d8-b412-4825-80f9-ac8ca280edb5&X-Atmosphere-Framework=2.3.1-javascript&X-Atmosphere-Transport=websocket&Content-Type=application/json; charset=UTF-8&X-atmo-protocol=true
atmosphere.js:3252 Sat Jan 30 2016 22:17:14 GMT+0100 (CET) Atmosphere: websocket.onopen
atmosphere.js:3252 Websocket successfully opened
atmosphere.js:3252 Sat Jan 30 2016 22:17:15 GMT+0100 (CET) Atmosphere: websocket.onclose
atmosphere.js:3252 Websocket closed, reason: Connection was closed abnormally (that is, with no close frame being sent). - wasClean: false
atmosphere.js:3252 Sat Jan 30 2016 22:17:15 GMT+0100 (CET) Atmosphere: Request already closed, not firing onClose (closed case)
atmosphere.js:3252 Sat Jan 30 2016 22:17:15 GMT+0100 (CET) Atmosphere: Request already closed, not firing onClose (closed case)
atmosphere.js:3252 Sat Jan 30 2016 22:17:15 GMT+0100 (CET) Atmosphere: invoking .close() on WebSocket object
atmosphere.js:3252 Websocket reconnect maximum try reached 2
atmosphere.js:3252 Websocket error, reason: 
atmosphere.js:3252 Sat Jan 30 2016 22:17:15 GMT+0100 (CET) Atmosphere: Firing onError, reasonPhrase: maxReconnectOnClose reached

Затем я перезапустил свой сервер. Клиент автоматически переподключается, потому что он пытается инициировать соединение атмосферы в onError, Вот журнал, который я получаю:

atmosphere.js:1195 WebSocket connection to 'ws://www.example.com:8080/socket/widget/2418C3F0-9A9B-48C4-8EE3-0541465EEACD%7C%7Crefdgdfgwe324234%7C%7CAF8F7A67-CDD0-4AD3-96C4-D447E970D0F8?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.3.1-javascript&X-Atmosphere-Transport=websocket&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true' failed: Error during WebSocket handshake: Unexpected response code: 302
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: websocket.onerror
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: websocket.onclose
atmosphere.js:3252 Websocket closed, reason: Connection was closed abnormally (that is, with no close frame being sent). - wasClean: false
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: Firing onClose (closed case)
ConsoleLogger.java:32 AtmosphereListener: onClose
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: Request already closed, not firing onClose (closed case)
atmosphere.js:3252 Websocket failed on first connection attempt. Downgrading to long-polling and resending
ConsoleLogger.java:32 AtmosphereListener: onTransportFailure: Websocket failed on first connection attempt. Downgrading to long-polling and resending
ConsoleLogger.java:32 AtmosphereListener: onTransportFailure: Websocket failed on first connection attempt. Downgrading to long-polling and resendingmhi_g$ @ ConsoleLogger.java:32Hgi_g$ @ SimpleConsoleLogHandler.java:36cgi_g$ @ Logger.java:262bgi_g$ @ Logger.java:250ugi_g$ @ Logger.java:178tgi_g$ @ Logger.java:162Agi_g$ @ Logger.java:129pNi_g$ @ AtmosphereListener.java:114(anonymous function) @ AtmosphereRequestConfig.java:389shc_g$ @ Impl.java:239vhc_g$ @ Impl.java:291(anonymous function) @ Impl.java:77_reconnectWithFallbackTransport @ atmosphere.js:1729_websocket.onclose @ atmosphere.js:1534
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: ajaxRequest.onreadystatechange, new state: 2
2atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: ajaxRequest.onreadystatechange, new state: 3
atmosphere.js:2117 XHR finished loading: GET "http://www.example.com:8080/socket/widget/2418C3F0-9A9B-48C4-8…plication%2Fjson%3B%20charset%3DUTF-8&X-atmo-protocol=true&_=1454188963647"._executeRequest @ atmosphere.js:2117_execute @ atmosphere.js:644_reconnectWithFallbackTransport @ atmosphere.js:1745_websocket.onclose @ atmosphere.js:1534
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: ajaxRequest.onreadystatechange, new state: 4
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: ajaxRequest.onreadystatechange, new state: 2
atmosphere.js:3252 Sat Jan 30 2016 22:22:43 GMT+0100 (CET) Atmosphere: Firing onOpen

Журнал говорит:

Сбой Websocket при первой попытке подключения. Переход на длительный опрос и повторную отправку

Как заставить Atmosphere.js использовать предпочитаемый транспорт (Websockets) вместо резервного (Long Polling) при перезапуске сервера?

1 ответ

Как заставить Atmosphere.js использовать предпочитаемый транспорт (Websockets) вместо резервного (Long Polling) при перезапуске сервера?

Клиент Atmosphere автоматически пытается восстановить соединение, используя fallbackTransport, Это поведение по умолчанию.

Для принудительного повторного подключения с использованием предпочтительного транспорта вам, возможно, придется изменить поведение по умолчанию.

Это можно изменить, закомментировав эту строку в атмосфере. См. Здесь.

Это гарантирует, что предпочтительный транспорт веб-сокета всегда используется при переподключении и fallbackTransport не будет использоваться.

_websocket.onclose = function(webSocketOpened) {
//...
if (_abortingConnection) {
    atmosphere.util.log(_request.logLevel, ["Websocket closed normally"]);
/** remove if you never want to use fallback transport
} else if (!webSocketOpened) {
    _reconnectWithFallbackTransport("Websocket failed on first connection attempt. Downgrading to " + _request.fallbackTransport + " and resending");
*/
} else if (_request.reconnect && _response.transport === 'websocket' ) {
    _clearState();
    if (_requestCount++ < _request.maxReconnectOnClose) {
        _open('re-connecting', _request.transport, _request);
        if (_request.reconnectInterval > 0) {
            _request.reconnectId = setTimeout(function () {
                _response.responseBody = "";
                _response.messages = [];
                _executeWebSocket(true);
            }, _request.reconnectInterval);
        } else {
            _response.responseBody = "";
            _response.messages = [];
            _executeWebSocket(true);
        }
    }
} else {
        atmosphere.util.log(_request.logLevel, ["Websocket reconnect maximum try reached " + _requestCount]);
        if (_canLog('warn')) {
            atmosphere.util.warn("Websocket error, reason: " + message.reason);
        }
        _onError(0, "maxReconnectOnClose reached");
    }
}

Другим способом было бы использовать onReconnect обратный вызов для переключения параметров clientRequest.request на лету.

Зачем?

Потому что, когда соединение закрыто и onTransportFailure вызывается. Атмосфера изменяет транспорт на fallbackTransport и может в конечном итоге закончиться = 'none' (если оно было установлено на websocket).

Предполагая, что ваш запрос включает в себя следующую конфигурацию:

  request.reconnectOnServerError= true,
  request.executeCallbackBeforeReconnect= true; 

Вы можете добавить это в свой onReconnect Перезвоните:

   clientRequest.request.transport = 'websocket'; // force preferred transport on reconnect
   //clientRequest.request.fallbackTransport = 'websocket'; // optional

Проблема в том, если вы установите запасной вариант websocket он будет пытаться восстановить соединение только один раз, и если вы оставите поле пустым, он все равно будет использовать протокол веб-сокета, если вы использовали url(начиная с ws:// или же wss://) и не webSocketUrl,

request.url = 'ws://example.com/ws'; 
Другие вопросы по тегам