2016-03-27 14 views
0

私はIMAP IDLE接続を有効に保つことに苦労してきました。 this Code Reviewによく似た私のコードは、ほとんどの場合動作しますが、メッセージの受信を停止することがあります。JavaMailのkeepConnectionAliveを使用してIMAP IDLE接続を維持する

それは次のようになります。

//... some code 
ScheduledExecutorService keepAlive = Executors.newScheduledThreadPool(1); 
Runnable toKeepAlive = new Runnable() { 
    public void run() { 
     keepAliveRunner(); 
    } 
}; 
keepAlive.scheduleAtFixedRate(toKeepAlive, 
    KEEP_ALIVE_FREQ, 
    KEEP_ALIVE_FREQ, 
    TimeUnit.MILLISECONDS); 
    //... other code ;) 
} 

public void keepAliveRunner() { 
    try { 
     imapFolder.doCommand(new IMAPFolder.ProtocolCommand() { 
      public Object doCommand(IMAPProtocol p) 
      throws ProtocolException { 
       p.simpleCommand("NOOP", null); 
       return null; 
      } 
     }); 
    } catch (MessagingException e) { 
     e.printStackTrace(); 
    } 
} 

私は、JavaMailののIMAPFolderクラスがkeepConnectionAliveメソッドを持っていることがわかりました。誰かがこの方法を使った経験があるかどうか疑問に思っていました。接続が1秒以上で使用されていない場合は、接続にnoopコマンドを発行します。

この方法は、Code Reviewのコードの代わりになるでしょうか?

+0

あなたのコードとまったく同じことを行うと説明されているように、なぜあなたが尋ねているのかを理解するのは難しいです。 – EJP

答えて

0

あなたの接続を永遠に生かし続けるつもりはありません。あなたのプログラムは接続失敗を処理できる必要があります。

通常、サーバは30分間未使用の接続を切断します。サーバーが何を考えていて、未使用の接続をさらに長く開いたままにして悪用したい場合は、29分ごとにFolder.getMessageCountを呼び出すだけです。 (IMAPFolder.doCommandの使用は不必要に複雑です。)それでも失敗する場合は、再接続してください。

関連する問題