一段时间后 WebSocket 连接无法重新连接
Posted
技术标签:
【中文标题】一段时间后 WebSocket 连接无法重新连接【英文标题】:WebSocket connection can't reconnect after some time 【发布时间】:2019-04-27 15:43:08 【问题描述】:我写了一些逻辑,表示同时有近 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 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.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)
我在*** 上找到了这个问题,但我看不到明确的答案。请帮助。提前致谢。
【问题讨论】:
【参考方案1】:如果您希望连接在空闲时保持打开状态,您应该这样配置您的客户端:
client.setMaxIdleTimeout(Long.MAX_VALUE);
将 maxIdleTimeout 设置为 0 会产生相反的效果:一旦连接空闲就关闭连接。
【讨论】:
我试试。谢谢。 将 Max IdleTimeout 设置为Long.MAX_VALUE
只会阻止 Jetty 的 WebSocketClient 关闭连接。网络堆栈中的其他玩家可以根据自己的空闲超时配置关闭连接。 (例如:jvm网络栈、os网络栈、网络本身、http中介、远程网络栈、远程网络服务器配置、远程websocket端点配置等...)以上是关于一段时间后 WebSocket 连接无法重新连接的主要内容,如果未能解决你的问题,请参考以下文章
socket 用disconnect 断开,再重新连接怎么搞