Iss*_*ava 5 timeout jetty websocket
我正在尝试设置websocket客户端/服务器.问题出现是由于会话中的不活动,在大约30~60秒之后没有数据传输,客户端关闭连接,例外情况:
org.eclipse.jetty.websocket.api.WebSocketTimeoutException: Timeout on Read
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onReadTimeout(AbstractWebSocketConnection.java:505)
at org.eclipse.jetty.io.AbstractConnection.onFillInterestedFailed(AbstractConnection.java:258)
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillInterestedFailed(AbstractWebSocketConnection.java:481)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.failed(AbstractConnection.java:415)
at org.eclipse.jetty.io.FillInterest.onFail(FillInterest.java:100)
at org.eclipse.jetty.io.AbstractEndPoint.onIdleExpired(AbstractEndPoint.java:146)
at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:153)
at org.eclipse.jetty.io.IdleTimeout$1.run(IdleTimeout.java:50)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
ES:套接字关闭:[1001]空闲超时
这没有任何意义,因为我已经在客户端和服务器端尝试将maxIdleTimeout设置为更大的值,甚至在会话建立后,我检查它:
client.setMaxIdleTimeout(0);
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的值而不是上面的"0"无济于事.
这个问题已有 2 年了,但仍然存在。其背后的原因是 Jetty 默认 websocket 超时为 5 分钟(请参阅org.eclipse.jetty.websocket.api.WebSocketPolicy),而在 Tomcat 上为 0。
要修复此问题,您可以在 WebSocket 客户端代码中执行以下操作:
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
Session session = container.connectToServer(this, endpointURI);
session.setMaxIdleTimeout(0);
Run Code Online (Sandbox Code Playgroud)
但是,最好实施@OnError并session.close()再次连接以保持连接稳定。另外,JettyWebSocketTimeoutException是从 RuntimeException 派生的,您可以检查 Throwable 的实例并仅在 RuntimeException 上重新连接。对于服务器关闭等情况的“真正”错误处理应该在 IOException 处理中container.connectToServer()
| 归档时间: |
|
| 查看次数: |
4425 次 |
| 最近记录: |