Ich habe in letzter Zeit an annotierten Websockets gearbeitet, mit der Jetty API (9.4.5 release)
, und einen Chat damit gemacht.Jetty Websocket IdleTimeout
Allerdings habe ich ein Problem, nach 5 Minuten (die ich glaube, ist der Standard-Timer), ist die Sitzung geschlossen (es ist nicht auf einen Fehler zurückzuführen). Die einzige Lösung, die ich bisher gefunden habe, besteht darin, mein Socket beim Schließen des Ereignisses zu benachrichtigen und die Verbindung in einem neuen Socket erneut zu öffnen.
jedoch i auf Stackoverflow gelesen habe, dass IdleTimeOut
im WebsocketPolicy, indem ich das Problem vermeiden konnte: bei
Ich habe versucht Einstellung
3600000
zum Beispiel, aber das Verhalten ändert sich nicht alleich habe auch versucht, es zu
-1
zu setzen, aber ich bekomme die folgende Fehlermeldung: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; }
Ich habe auch versucht, die Politik direkt im OnConnect
Ereignis zu ändern, indem Sie den Anruf session.getpolicy.setIdleTimeOut()
verwenden, aber ich habe keine Ergebnisse bemerkt.
Ist dies ein erwartetes Verhalten oder fehlt mir etwas? Danke für Ihre Hilfe.
EDIT:
Log auf dem Verschluss: Client Side:
2017-07-03T12:48:00.552 DEBUG [email protected] Ignored idle endpoint [email protected]{localhost/127.0.0.1:5080<->/127.0.0.1:53835,OPEN,fill=-,flush=-,to=1/300000}{io=0/0,kio=0,kro=1}->WebSock[email protected][[email protected][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],[email protected][ExtensionStack,s=START,c=0,len=187,f=null]]
Server-Seite:
2017-07-03T12:48:00.595 DEBUG Idle pool thread onClose [email protected][[email protected][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],[email protected][ExtensionStack,s=START,c=0,len=2,f=CLOSE[len=2,fin=true,rsv=...,masked=true]]]<[email protected]'{'/127.0.0.1:53835<->/127.0.0.1:5080,CLOSED,fill=-,flush=-,to=1/360000000}'{'io=0/0,kio=-1,kro=-1}->[email protected][[email protected][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],[email protected][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 [email protected]e2 invoked org.eclipse.jetty.io.ManagedSelector$$Lambda$193/[email protected]
2017-07-03T12:48:00.595 DEBUG Idle pool thread [email protected]/[email protected]/PRODUCING/0/1 produce exit
2017-07-03T12:48:00.595 DEBUG Idle pool thread ran [email protected]/[email protected]/PRODUCING/0/1
2017-07-03T12:48:00.595 DEBUG Idle pool thread run [email protected]/[email protected]/PRODUCING/0/1
2017-07-03T12:48:00.595 DEBUG Idle pool thread [email protected]/[email protected]/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)
können Sie Ihre Protokolle veröffentlichen? Wenn ein Socket von der anderen Seite geschlossen wird, erhalten Sie normalerweise einen Fehler. Keepalive-Einstellungen können auch beeinflussen, dass – ApriOri
Ich werde den Kommentar bearbeiten, um das Protokoll auf der Client-und Server-Seite hinzuzufügen. Allerdings habe ich keinen Keepalive-Parameter in der Richtlinie gefunden. Ist es eine Sache in Jetty Websocket API? – Youri