Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将jetty websocket maxIdleTimeout设置为60秒以上_Java_Session_Websocket_Timeout_Jetty - Fatal编程技术网

Java 无法将jetty websocket maxIdleTimeout设置为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

我正在尝试使用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.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谢谢你,我稍后会用更新的版本再试一次,并报告。