Jetty Websocket IdleTimeout

我最近一直在使用Jetty API (9.4.5 release)带注释的websockets,并与之聊天。

但是我遇到了一个问题,5分钟后(我认为是默认计时器),会话关闭(这不是由于错误)。 我发现的唯一解决方案是通知我的socket关闭事件并在新套接字中重新打开连接。

但是我已经阅读了stackOverflow,通过在WebsocketPolicy中设置IdleTimeOut ,我可以避免这个问题:

  1. 我试过设置为3600000 ,但行为根本没有改变

  2. 我也尝试将其设置为-1但我得到以下错误: IdleTimeout [-1] must be a greater than or equal to 0

     private ServletContextHandler setupWebsocketContext() { ServletContextHandler websocketContext = new AmosContextHandler(ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY); WebSocketHandler socketCreator = new WebSocketHandler(){ @Override public void configure(WebSocketServletFactory factory){ factory.getPolicy().setIdleTimeout(-1); factory.getPolicy().setMaxTextMessageBufferSize(MAX_MESSAGE_SIZE); factory.getPolicy().setMaxBinaryMessageBufferSize(MAX_MESSAGE_SIZE); factory.getPolicy().setMaxTextMessageSize(MAX_MESSAGE_SIZE); factory.getPolicy().setMaxBinaryMessageSize(MAX_MESSAGE_SIZE); factory.setCreator(new UpgradedSocketCreator()); } }; ServletHolder sh = new ServletHolder(new WebsocketChatServlet()); websocketContext.addServlet(sh, "/*"); websocketContext.setContextPath("/Chat"); websocketContext.setHandler(socketCreator); websocketContext.getSessionHandler().setMaxInactiveInterval(0); return websocketContext; } 

我还尝试使用调用session.getpolicy.setIdleTimeOut()直接在OnConnect事件中更改策略,但我没有注意到任何结果。

这是预期的行为还是我错过了什么? 谢谢你的帮助。

编辑:

登录关闭:客户端:

 2017-07-03T12:48:00.552 DEBUG HttpClient@179313750-scheduler Ignored idle endpoint SocketChannelEndPoint@2fb4b627{localhost/127.0.0.1:5080/127.0.0.1:53835,OPEN,fill=-,flush=-,to=1/300000}{io=0/0,kio=0,kro=1}->WebSocketClientConnection@e0198ece[ios=IOState@3ac0ec79[CLOSING,in,!out,close=CloseInfo[code=1000,reason=null],clean=false,closeSource=LOCAL],f=Flusher[queueSize=0,aggregateSize=0,failure=null],g=Generator[CLIENT,validating],p=Parser@65c4d838[ExtensionStack,s=START,c=0,len=187,f=null]] 

服务器端:

  2017-07-03T12:48:00.595 DEBUG Idle pool thread onClose WebSocketServerConnection@e0033d54[ios=IOState@10d40dca[CLOSED,!in,!out,finalClose=CloseInfo[code=1000,reason=null],clean=true,closeSource=REMOTE],f=Flusher[queueSize=0,aggregateSize=0,failure=null],g=Generator[SERVER,validating],p=Parser@317213f3[ExtensionStack,s=START,c=0,len=2,f=CLOSE[len=2,fin=true,rsv=...,masked=true]]]<-SocketChannelEndPoint@690dfbfb'{'/127.0.0.1:53835/127.0.0.1:5080,CLOSED,fill=-,flush=-,to=1/360000000}'{'io=0/0,kio=-1,kro=-1}->WebSocketServerConnection@e0033d54[ios=IOState@10d40dca[CLOSED,!in,!out,finalClose=CloseInfo[code=1000,reason=null],clean=true,closeSource=REMOTE],f=Flusher[queueSize=0,aggregateSize=0,failure=null],g=Generator[SERVER,validating],p=Parser@317213f3[ExtensionStack,s=START,c=0,len=2,f=CLOSE[len=2,fin=true,rsv=...,masked=true]]] 2017-07-03T12:48:00.595 DEBUG Idle pool thread org.eclipse.jetty.util.thread.Invocable$InvocableExecutor@4f13dee2 invoked org.eclipse.jetty.io.ManagedSelector$$Lambda$193/682154970@551e133a 2017-07-03T12:48:00.595 DEBUG Idle pool thread EatWhatYouKill@6ba355e4/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@7b1559f1/PRODUCING/0/1 produce exit 2017-07-03T12:48:00.595 DEBUG Idle pool thread ran EatWhatYouKill@6ba355e4/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@7b1559f1/PRODUCING/0/1 2017-07-03T12:48:00.595 DEBUG Idle pool thread run EatWhatYouKill@6ba355e4/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@7b1559f1/PRODUCING/0/1 2017-07-03T12:48:00.595 DEBUG Idle pool thread EatWhatYouKill@6ba355e4/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@7b1559f1/PRODUCING/0/1 run 2017-07-03T12:48:00.597 DEBUG Idle pool thread 127.0.0.1 has disconnected ! 2017-07-03T12:48:00.597 DEBUG Idle pool thread Disconnected: 127.0.0.1 (127.0.0.1) (statusCode= 1,000 , reason=null) 

带注释的WebSockets在注释中有自己的超时设置。

 @WebSocket(maxIdleTime=30000) 

注释@WebSocket有选项:

 int maxIdleTime() default -2; 

事实上,目前还不清楚它是什么意思。

如果您检查实施,您可以找到:

 if (anno.maxIdleTime() > 0) { this.policy.setIdleTimeout(anno.maxIdleTime()); } 

方法实现:

 /** * The time in ms (milliseconds) that a websocket may be idle before closing. * * @param ms * the timeout in milliseconds */ public void setIdleTimeout(long ms) { assertGreaterThan("IdleTimeout",ms,0); this.idleTimeout = ms; } 

最后:

 /** * The time in ms (milliseconds) that a websocket may be idle before closing. * 

* Default: 300000 (ms) */ private long idleTimeout = 300000;

结论:负值应用默认行为(300000 ms)。 您需要根据业务价值配置’idleTimeout’。

PS:解决了我的情况:

 @WebSocket(maxIdleTime = Integer.MAX_VALUE)