码头Websocket空闲超时 [英] Jetty Websocket IdleTimeout
问题描述
我最近一直在使用Jetty API (9.4.5 release)
来处理带注释的websocket,并与之聊天.
I've been working on annotated websockets lately, with the Jetty API (9.4.5 release)
, and made a chat with it.
但是我遇到了一个问题,在5分钟后(我相信这是默认计时器),该会话已关闭(这不是由于错误). 我发现的唯一解决方案是在关闭事件发生时通知我的套接字,然后在新的套接字中重新打开连接.
However i got an issue, after 5 minutes (which i believe is the default timer), the session is closed (it is not due to an error). The only solution I've found yet, is to notify my socket On closing event and reopen the connection in a new socket.
但是,我在stackOverflow上已经读到过,通过在WebsocketPolicy中设置IdleTimeOut
,我可以避免此问题:
However i've read on stackOverflow, that by setting IdleTimeOut
in the WebsocketPolicy, i could avoid the issue:
-
例如,我尝试设置为
3600000
,但是行为完全没有改变
I've tried setting to
3600000
for instance, but the behavior does not change at all
我也尝试将其设置为-1
,但出现以下错误:IdleTimeout [-1] must be a greater than or equal to 0
I also tried to set it to -1
but i get the following error: 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
事件中直接更改策略,但是我没有注意到任何结果.
I've also tried to change the policy directly in the OnConnect
event, by using the call session.getpolicy.setIdleTimeOut()
, but I haven't noticed any results.
这是预期的行为还是我错过了一些东西?感谢您的帮助.
Is this an expected behavior or am I missing something? Thanks for your help.
登录闭包: 客户端:
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)
推荐答案
带注释的WebSocket在注释中具有自己的超时设置.
Annotated WebSockets have their own timeout settings in the annotation.
@WebSocket(maxIdleTime=30000)
这篇关于码头Websocket空闲超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!