Java 无法将jetty websocket maxIdleTimeout设置为60秒以上
我正在尝试使用jetty WebSocket,并希望为连接的会话设置一个用户可配置的空闲超时设置。似乎所有尝试的结果都是60秒超时:Java 无法将jetty websocket maxIdleTimeout设置为60秒以上,java,session,websocket,timeout,jetty,Java,Session,Websocket,Timeout,Jetty,我正在尝试使用jetty WebSocket,并希望为连接的会话设置一个用户可配置的空闲超时设置。似乎所有尝试的结果都是60秒超时: org.eclipse.jetty.websocket.api.CloseException: java.util.concurrent.TimeoutException: Idle timeout expired: 60002/60000 ms at org.eclipse.jetty.websocket.common.io.AbstractWe
org.eclipse.jetty.websocket.api.CloseException: java.util.concurrent.TimeoutException: Idle timeout expired: 60002/60000 ms
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onReadTimeout(AbstractWebSocketConnection.java:567)
at org.eclipse.jetty.io.AbstractConnection.onFillInterestedFailed(AbstractConnection.java:172)
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillInterestedFailed(AbstractWebSocketConnection.java:540)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.failed(AbstractConnection.java:317)
at org.eclipse.jetty.io.FillInterest.onFail(FillInterest.java:138)
at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillableFail(SslConnection.java:579)
at org.eclipse.jetty.io.ssl.SslConnection.onFillInterestedFailed(SslConnection.java:407)
at org.eclipse.jetty.io.ssl.SslConnection$2.failed(SslConnection.java:167)
at org.eclipse.jetty.io.FillInterest.onFail(FillInterest.java:138)
at org.eclipse.jetty.io.AbstractEndPoint.onIdleExpired(AbstractEndPoint.java:407)
at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:171)
at org.eclipse.jetty.io.IdleTimeout.idleCheck(IdleTimeout.java:113)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
@WebSocket(maxIdleTime = 65000) \\Idle timeout expired: 60002/60000 ms
@WebSocket(maxIdleTime = 50000) \\Idle timeout expired: 50001/50000 ms
为每个ws会话使用Jetty 9.4.26和@WebSocket注释的POJO
在注释中设置值实际上并不可行,因为空闲超时需要在运行时进行配置。但是,即使在设置时,如果设置为小于60秒的值,也只会产生差异:
org.eclipse.jetty.websocket.api.CloseException: java.util.concurrent.TimeoutException: Idle timeout expired: 60002/60000 ms
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onReadTimeout(AbstractWebSocketConnection.java:567)
at org.eclipse.jetty.io.AbstractConnection.onFillInterestedFailed(AbstractConnection.java:172)
at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillInterestedFailed(AbstractWebSocketConnection.java:540)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.failed(AbstractConnection.java:317)
at org.eclipse.jetty.io.FillInterest.onFail(FillInterest.java:138)
at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillableFail(SslConnection.java:579)
at org.eclipse.jetty.io.ssl.SslConnection.onFillInterestedFailed(SslConnection.java:407)
at org.eclipse.jetty.io.ssl.SslConnection$2.failed(SslConnection.java:167)
at org.eclipse.jetty.io.FillInterest.onFail(FillInterest.java:138)
at org.eclipse.jetty.io.AbstractEndPoint.onIdleExpired(AbstractEndPoint.java:407)
at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:171)
at org.eclipse.jetty.io.IdleTimeout.idleCheck(IdleTimeout.java:113)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
@WebSocket(maxIdleTime = 65000) \\Idle timeout expired: 60002/60000 ms
@WebSocket(maxIdleTime = 50000) \\Idle timeout expired: 50001/50000 ms
如果我手动设置传入@OnWebSocketConnect方法的会话超时,则完全相同:
session.setIdleTimeout(65000); \\Idle timeout expired: 60001/60000 ms
session.setIdleTimeout(50000); \\Idle timeout expired: 50001/50000 ms
我在WebSocketClient上调用connect(),并将带注释的pojo传递给connect():
但是,如果使用以下任一项,则上述超时行为仍然相同:
wsClient.getPolicy().setIdleTimeout(65000);
wsClient.setMaxIdleTimeout(65000);
jettyHttpClient.setIdleTimeout();似乎一点影响都没有
在IdleTimeout的setIdleTimeout()中添加断点并不能让事情变得更清楚,在连接过程中,该断点在4个不同的实例上被击中6次:
0 set in SocketChannelEndpoint (instance 1) via ClientSelectorManager.newEndPoint
300000 set in SocketChannelEndpoint (instance 2) via ServerConnector.newEndPoint
-1 set in SslConnection$DecyptedEndPoint (instance 1) via Constructor
-1 set in SslConnection$DecyptedEndPoint (instance 2) via setIdleTimeout
60000 set in SocketChannelEndpoint (instance 2) via WebSocketServerFactory.upgrade
65000 set in SocketChannelEndpoint (instance 1) via WebSocketUpgradeRequest.upgrade
我基本上不知道内部发生了什么。有5种设置超时的方法,在60秒以上似乎没有任何方法有效
类似于此线程的请求,但没有足够的代表在此处发表评论,因此创建了新线程。
升级您的Jetty版本。版本9.4.26是旧版本,从那时起,websocket impl有很多更新。事实上,我可以看到,在当前版本中,我们有专门针对这个场景的测试用例。@JoakimErdfelt非常感谢您的建议。你能确认你是想搬到jetty 10+还是更新的9.x版本吗?由于该代码所在的框架目前仅限于java 8,因此Jetty 9只是在可预见的情况下很不幸。Jetty 10和Jetty 11目前处于预发布阶段。使用Jetty 9.4.x版本,因为它们是稳定的分支。@JoakimErdfelt谢谢,我将稍后使用更新的版本再试一次,并报告。升级您的Jetty版本。版本9.4.26是旧版本,从那时起,websocket impl有很多更新。事实上,我可以看到,在当前版本中,我们有专门针对这个场景的测试用例。@JoakimErdfelt非常感谢您的建议。你能确认你是想搬到jetty 10+还是更新的9.x版本吗?由于该代码所在的框架目前仅限于java 8,因此Jetty 9只是在可预见的情况下很不幸。Jetty 10和Jetty 11目前处于预发布阶段。使用Jetty 9.4.x版本,因为它们是稳定的分支。@JoakimErdfelt谢谢你,我稍后会用更新的版本再试一次,并报告。