2017-07-03 3 views
2

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

  1. Ich habe versucht Einstellung 3600000 zum Beispiel, aber das Verhalten ändert sich nicht alle

  2. ich 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) 
+0

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

+0

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

Antwort

4

Kommentierte WebSockets haben ihre eigene Timeout-Einstellungen in der Anmerkung.

@WebSocket(maxIdleTime=30000) 
+0

Danke für die Antwort Joakim, es funktioniert! Kann ich MaxIdleTime auch für einen unbegrenzten Keepalive-Timer auf -1 setzen? Es scheint nicht zu funktionieren, trotzdem könnte ich einfach eine IdleTime lang genug setzen, damit das Problem gelöst ist. – Youri

Verwandte Themen