码头Websocket空闲超时 [英] Jetty Websocket IdleTimeout

查看:837
本文介绍了码头Websocket空闲超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近一直在使用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:

  1. 例如,我尝试设置为3600000,但是行为完全没有改变

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆