4

優先トランスポートが失敗すると、大気はフォールバック トランスポートを使用しようとします。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);

サーバーが実行されていて、クライアントが初めて接続するとき (ページのリロード)、接続は Websocket にあります。次に、クライアントに次のように表示されるサーバーを停止しました。

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) を使用するように強制するにはどうすればよいですか?

4

1 に答える 1

-1

サーバーの再起動時に、Atmosphere.js がフォールバック トランスポート (ロング ポーリング) ではなく優先トランスポート (Websockets) を使用するように強制するにはどうすればよいですか?

Atmosphere クライアントは、 を使用して自動的に再接続を試みますfallbackTransport。これがデフォルトの動作です。

優先トランスポートを使用して強制的に再接続するには、デフォルトの動作を変更する必要がある場合があります。

これは、atmosphere.js のこの行をコメント アウトすることで変更できます。ここを参照してください

これにより、優先される Web ソケット トランスポートが再接続時に常に使用され、 が使用され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");
    }
}

もう 1 つの方法は、onReconnectコールバックを使用して clientRequest.request パラメーターをその場で元に戻すことです。

なんで?

接続が閉じられonTransportFailureて呼び出されるためです。Atmosphere はトランスポートを 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と、再接続が 1 回だけ試行されることです。空白のままにすると、 (またはurlで始まる)を使用し、 .ws://wss://webSocketUrl

request.url = 'ws://example.com/ws'; 
于 2016-02-06T21:29:45.453 に答える