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



我写了一些逻辑,表示同时有近200个webocet连接到exchange。我使用第三方api,它基于org.eclipse.jjetty.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位于org.eclipse.japty.io.WriteFlusher.onClose(WriteFlusher.java:507(org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.OIncompleteFlush(SslConnection.java:527(在org.eclipse.japty.io.AbstractEndPoint$2.onCompleteFlush(AbstractEndPoint.java:54(网址:org.eclipse.japty.io.WriteFlusher.write(WriteFlusher.java:331(org.eclipse.japty.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.jjetty.util.IteratingCallback.producing(IteratingCallback.java:241(在org.eclipse.jjetty.util.IteratingCallback.iiterate(IteratingCallback.java:224(在org.eclipse.jetty.websocket.common.io.FrameFlusher.enqueue(FrameFlusher.java:382(在org.eclipse.jjetty.webocket.common.io.AbstractWebSocketConnection.outgoingFrame(AbstractWebSocket-Connection.java:614(在org.eclipse.jetty.webocket.client.io.WebSocketClientConnection.outgoingFrame(WebSocketClient Connection.java:72(在org.eclipse.jjetty.webocket.common.io.AbstractWebSocketConnection.onConnectionStateChange(AbstractWebSockeConnection.java:473(在org.eclipse.jetty.websocket.common.io.IOState.notifyStateListeners(IOState.java:184(在org.eclipse.japty.websocket.common.io.IOState.onReadFailure(IOState.java:498(在org.eclipse.jjetty.webocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocket-Connection.java:666(在org.eclipse.jjetty.webocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocket-Connection.java:511(在org.eclipse.japty.io.AbstractConnection$ReadCallback.成功(AbstractConnection.java:279(网址:org.eclipse.jjetty.io.FillInterest.fillable(FillInterest.java:104(在org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:289(在org.eclipse.jetty.io.ssl.SslConnection$3.成功(SslConnection.java:149(网址:org.eclipse.jjetty.io.FillInterest.fillable(FillInterest.java:104(在org.eclipse.jjetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124(在org.eclipse.jjetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYou Kill.java:247(在org.eclipse.jjetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYou Kill.java:140(在org.eclipse.jjetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYou Kill.java:131(在org.eclipse.jjetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThread Executor.java:243(在org.eclipse.jjetty.util.thread.QueuedThreadPool.runJob(QueuedTthreadPool.java:679(在org.eclipse.jjetty.util.thread.QueuedThreadPool$2.run(QueuedTthreadPool.java:597(在java.lang.Thread.run(Thread.java:748(

我在stackoverflow上找到了这个问题,但我看不到明确的答案。请帮忙。提前谢谢。

如果你想在空闲时保持连接打开,你应该这样配置你的客户端:

client.setMaxIdleTimeout(Long.MAX_VALUE);

将maxIdleTimeout设置为0会产生相反的效果:一旦连接空闲,就关闭连接。

最新更新