WebSocket连接在一段时间后无法重新连接

时间:2018-11-26 01:09:24

标签: java websocket jetty

我写了一些逻辑,表示同时进行近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,这样当我很长时间不接收信息时,连接不会丢失。 一天一次交换关闭连接,但有2,3有时4天已经重新连接。但是最后我得到了:

  

java.nio.channels.ClosedChannelException:在null   org.eclipse.jetty.io.WriteFlusher.onClose(WriteFlusher.java:507)在   org.eclipse.jetty.io.ssl.SslConnection $ DecryptedEndPoint.onIncompleteFlush(SslConnection.java:527)     在   org.eclipse.jetty.io.AbstractEndPoint $ 2.onIncompleteFlush(AbstractEndPoint.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.enqueue(FrameFlusher.java:382)     在   org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.outgoingFrame(AbstractWebSocketConnection.java:614)     在   org.eclipse.jetty.websocket.client.io.WebSocketClientConnection.outgoingFrame(WebSocketClientConnection.java:72)     在   org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onConnectionStateChange(AbstractWebSocketConnection.java:473)     在   org.eclipse.jetty.websocket.common.io.IOState.notifyStateListeners(IOState.java:184)     在   org.eclipse.jetty.websocket.common.io.IOState.onReadFailure(IOState.java:498)     在   org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocketConnection.java:666)     在   org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocketConnection.java:511)     在   org.eclipse.jetty.io.AbstractConnection $ ReadCallback.succeeded(AbstractConnection.java:279)     在org.eclipse.jetty.io.FillInterest.fillable(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.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)     在   org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)     在   org.eclipse.jetty.util.thread.ReservedThreadExecutor $ ReservedThread.run(ReservedThreadExecutor.java:243)     在   org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:679)     在   org.eclipse.jetty.util.thread.QueuedThreadPool $ 2.run(QueuedThreadPool.java:597)     在java.lang.Thread.run(Thread.java:748)

我在stackoverflow上发现了这个问题,但是我看不到明确的答案。请帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

如果希望连接在空闲时保持打开状态,则应采用以下方式配置客户端:

client.setMaxIdleTimeout(Long.MAX_VALUE);

将maxIdleTimeout设置为0会产生相反的效果:连接空闲后立即关闭。