2017-07-03 26 views
2

私は最近、Jetty API (9.4.5 release)と注釈付きウェブソケットを作成しており、チャットを行っています。Jetty Websocket IdleTimeout

しかし、5分後に問題が発生しました(これはデフォルトタイマと思われます)、セッションは終了しています(エラーのためではありません)。 私が見つけた唯一の解決策は、イベントを閉じるときに私のソケットに通知し、新しいソケットで接続を再度開くことです。

  1. 私はインスタンスの3600000に設定しようとしたが、動作は時に変更されません:私はWebsocketPolicyでIdleTimeOutを設定することで、私はこの問題を避けることができると、StackOverflowの上で読んだしかし

    私はまた、-1にそれを設定しようとしましたが、私は次のエラーを取得するすべての

  2. 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イベントで直接ポリシーを変更しようとしましたが、何も気付かれませんでした。

これは予期された動作ですか、何か不足していますか?ご協力いただきありがとうございます。

EDIT:閉鎖の

ログイン: クライアント側:

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}->[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]] 

サーバー側:

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

ログはポストできますか?ソケットが反対側で閉じられていると、通常は何らかのエラーが発生します。キープアライブの設定も影響を受ける可能性があります。 – ApriOri

+0

クライアントとサーバー側でログを追加するコメントを編集します。 しかし、私はポリシーにキープアライブパラメータが見つかりませんでした。 Jetty Websocket APIのものですか? – Youri

答えて

4

注釈付きWebSocketを注釈で独自のタイムアウト設定を持っています。

@WebSocket(maxIdleTime=30000) 
+0

答えのおかげでJoakim、それは動作します! 無限キープアライブタイマーのmaxIdleTimeを-1に設定することはできますか? それはうまくいかないようですが、とにかく私はIdleTimeを十分長く設定することができるので、問題は解決されます。 – Youri

関連する問題