无法将jetty websocket maxidletimeout设置为60秒以上

hiz5n14c  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(801)

我正在尝试使用jettywebsockets,并希望为连接的会话设置一个用户可配置的空闲超时设置。似乎所有尝试都会导致60秒的超时:

  1. org.eclipse.jetty.websocket.api.CloseException: java.util.concurrent.TimeoutException: Idle timeout expired: 60002/60000 ms
  2. at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onReadTimeout(AbstractWebSocketConnection.java:567)
  3. at org.eclipse.jetty.io.AbstractConnection.onFillInterestedFailed(AbstractConnection.java:172)
  4. at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillInterestedFailed(AbstractWebSocketConnection.java:540)
  5. at org.eclipse.jetty.io.AbstractConnection$ReadCallback.failed(AbstractConnection.java:317)
  6. at org.eclipse.jetty.io.FillInterest.onFail(FillInterest.java:138)
  7. at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillableFail(SslConnection.java:579)
  8. at org.eclipse.jetty.io.ssl.SslConnection.onFillInterestedFailed(SslConnection.java:407)
  9. at org.eclipse.jetty.io.ssl.SslConnection$2.failed(SslConnection.java:167)
  10. at org.eclipse.jetty.io.FillInterest.onFail(FillInterest.java:138)
  11. at org.eclipse.jetty.io.AbstractEndPoint.onIdleExpired(AbstractEndPoint.java:407)
  12. at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:171)
  13. at org.eclipse.jetty.io.IdleTimeout.idleCheck(IdleTimeout.java:113)
  14. at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  15. at java.util.concurrent.FutureTask.run(FutureTask.java:266)

对每个ws会话使用jetty9.4.26和@websocket注解的pojo。
在注解中设置一个值实际上是不可行的,因为空闲超时需要在运行时进行配置。但是,即使设置为60秒以下,也只会产生影响:

  1. @WebSocket(maxIdleTime = 65000) \\Idle timeout expired: 60002/60000 ms
  2. @WebSocket(maxIdleTime = 50000) \\Idle timeout expired: 50001/50000 ms

如果我手动设置传入@onwebsocketconnect方法的会话超时,则完全相同:

  1. session.setIdleTimeout(65000); \\Idle timeout expired: 60001/60000 ms
  2. session.setIdleTimeout(50000); \\Idle timeout expired: 50001/50000 ms

在websocketclient上调用connect(),我将其示例化为singleton,并将带注解的pojo传递到connect():

  1. HttpClient jettyHttpClient = new HttpClient(getWebSocketSslContextFactory());
  2. jettyHttpClient.start();
  3. WebSocketClient wsClient = new WebSocketClient(jettyHttpClient);
  4. wsClient.start();

但是,如果使用以下任一项,则上述超时行为仍然相同:

  1. wsClient.getPolicy().setIdleTimeout(65000);
  2. wsClient.setMaxIdleTimeout(65000);

jettyhttpclient.setidletimeout();似乎一点影响都没有。。。。
在idletimeout的setidletimeout()中添加断点并不能使事情变得更清楚,在连接过程中,该断点在4个不同的示例上被命中6次:

  1. 0 set in SocketChannelEndpoint (instance 1) via ClientSelectorManager.newEndPoint
  2. 300000 set in SocketChannelEndpoint (instance 2) via ServerConnector.newEndPoint
  3. -1 set in SslConnection$DecyptedEndPoint (instance 1) via Constructor
  4. -1 set in SslConnection$DecyptedEndPoint (instance 2) via setIdleTimeout
  5. 60000 set in SocketChannelEndpoint (instance 2) via WebSocketServerFactory.upgrade
  6. 65000 set in SocketChannelEndpoint (instance 1) via WebSocketUpgradeRequest.upgrade

我基本上不知道内部发生了什么。有5种设置超时的方法,似乎没有什么工作超过60秒。
类似于此线程的请求,但没有足够的代表在那里发表评论,因此出现了新线程。码头腹板箱空转时间

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题