Как заставить 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';