Соединение WebSocket не может восстановиться через некоторое время - PullRequest
0 голосов
/ 26 ноября 2018

Я написал некоторую логику, которая представляет около 200 соединений websocet с обменом одновременно. Я использую сторонний API, и он основан на org.eclipse.jetty.websocket.api .У меня есть этот метод, который мне пришлось переопределить.

try {
            URI uri = new URI(websocketBaseUrl + url);
            SslContextFactory sslContextFactory = new SslContextFactory();
            sslContextFactory.setTrustAll(true); 
            WebSocketClient client = new WebSocketClient(sslContextFactory);
            client.setMaxIdleTimeout(0);
            client.start();
            return client.connect(adapter, uri).get();
        } catch (URISyntaxException  e) {
            throw new BinanceApiException("URL Syntax error: " + e.getMessage());
        } catch (Throwable e) {
            throw new BinanceApiException("Websocket error: " + e.getMessage());
        }

Я добавил setIdleTimeout, чтобы соединение не потерялось, если я не получаю информацию в течение длительного времени.Exchange закрывает соединение один раз в день, но в течение 2,3, а иногда и 4 дней оно снова подключается. Но наконец я получаю следующее:

java.nio.channels.ClosedChannelException: null at org.eclipse.jetty.io.WriteFlusher.onClose (WriteFlusher.java:507) в org.eclipse.jetty.io.ssl.SslConnection $ DecryptedEndPoint.onIncompleteFlush (SslConnection.java:527) в org.eclipse.jetty.io.Flush.InEAbstractEndPoint.java:54) в org.eclipse.jetty.io.WriteFlusher.write (WriteFlusher.java:331) в org.eclipse.jetty.io.AbstractEndPoint.write (AbstractEndPoint.java:372) в org.eclipse.jetty.websocket.common.io.FrameFlusher $ Flusher.flush (FrameFlusher.java:153) в org.eclipse.jetty.websocket.common.io.FrameFlusher $ Flusher.process (FrameFlusher.java:217) в org.eclipse.jetty.util.IteratingCallback.processing (IteratingCallback.java:241) в org.eclipse.jetty.util.IteratingCallback.iterate (IteratingCallback.java:224) в org.eclipse.jetty.websocket.common.io.FrameFlusher.enqueueher.java:382) по адресу org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.outgoingFrame (AbstractWebSocketConnection.java:614) по адресу org.eclipse.jetty.websocket.client.io.WebSocketauneConConjectClientClient72) в org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onConnectionStateChange (AbstractWebSocketConnection.java:473) в org.eclipse.jetty.websocket.common.io.IOState.notifyState4tate org: I.eclipse.jetty.websocket.common.io.IOState.onReadFailure (IOState.java:498) в org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse (AbstractWebSocketConnection.java:etl.sel или org) at.websocket.common.io.AbstractWebSocketConnection.onFillable (AbstractWebSocketConnection.java:511) в org.eclipse.jetty.io.AbstractConnection $ ReadCallback.succeeded (AbstractConnection.java:279) в org.eclipio.(FillInterest.java:104) в org.eclipse.jetty.io.ssl.SslConnection.onFillable (SslConnection.java:289) в org.eclipse.jetty.io.ssl.SslConnection $ 3.succeeded (SslConnection.java:149) в org.eclipse.jetty.io.FillInterest.fillable (FillInterest.java:104 вorg.eclipse.jetty.io.ChannelEndPoint $ 2.run (ChannelEndPoint.java:124) в org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce (EatWhatYouKill.java:247) в org.eclipsej.thread.strategy.$ ReservedThread.run (ReservedThreadExecutor.java:243) в org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:679) в org.eclipse.jetty.util.thread.QouedJava: 597) at java.lang.Thread.run (Thread.java:748)

Я нахожу этот вопрос на stackoverflow , но не вижу четкого ответа.Просьба помочь. Спасибо заранее.

1 Ответ

0 голосов
/ 26 ноября 2018

Если вы хотите, чтобы соединение оставалось открытым, если оно не используется, вы должны сконфигурировать ваш клиент следующим образом:

client.setMaxIdleTimeout(Long.MAX_VALUE);

Установка maxIdleTimeout в 0 будет иметь противоположный эффект: закрытие соединения, как только оно станет бездействующим.

...