【问题标题】:Jetty websocket read timeout码头 websocket 读取超时
【发布时间】:2014-06-30 14:44:49
【问题描述】:

我正在尝试设置 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)

ES:套接字关闭:[1001] 空闲超时

这是没有意义的,因为我在客户端和服务器端都尝试将 maxIdleTimeout 设置为更大的值,即使在会话建立后,我也会检查它:

client.setMaxIdleTimeout(0);

我尝试了不同的值而不是上面的“0”,但无济于事。

【问题讨论】:

    标签: websocket timeout jetty


    【解决方案1】:

    这个问题已经存在 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);
    
    • 使用 Jetty 9.3.9.v20160517 和 Tomcat 8+ 进行测试 - 问题在 Jetty 中停止出现,而 Tomcat 的行为相同。

    但是,实现@OnError 并执行session.close() 并再次连接以保持连接稳定可能是个好主意。此外,Jetty 的WebSocketTimeoutException 派生自 RuntimeException,您可以检查 Throwable 实例并仅在 RuntimeExceptions 上重新连接。对于服务器宕机等情况的“真正”错误处理应该在container.connectToServer()的IOException处理中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多