2017-08-30 170 views
0

我有下面的類執行的ScheduledThreadPoolExecutor時停止捕獲的異常

public class MaintanceTools { 
    public static final ScheduledThreadPoolExecutor THREADSUPERVISER; 
    private static final int ALLOWEDIDLESECONDS = 1*20; 

    static { 
     THREADSUPERVISER = new ScheduledThreadPoolExecutor(10); 
    } 
    public static void launchThreadsSupervising() { 
     THREADSUPERVISER.scheduleWithFixedDelay(() -> { 
      System.out.println("maintance launched " + Instant.now()); 
      ACTIVECONNECTIONS.forEach((connection) -> { 
       try { 
        if (!connection.isDataConnected() && 
         (connection.getLastActionInstant() 
           .until(Instant.now(), SECONDS) > ALLOWEDIDLESECONDS)) { 
        connection.closeFTPConnection(); 
        ACTIVECONNECTIONS.remove(connection); 
        } 
       } catch (Throwable e) { } 
      }); 
      System.out.println("maintance finished " + Instant.now()); 
     }, 0, 20, TimeUnit.SECONDS); 
    } 
} 

它迭代所有的FTP連接(因爲我寫的FTP服務器),檢查是否連接不發送一段時間的任何數據和空閒並關閉如果是的話連接。 問題是在中斷線程拋出一些異常之後,任務永遠不會運行。我知道它是用文檔編寫的 如果任務的任何執行遇到異常,則後續執行被禁止。否則,任務將僅通過取消或終止執行者而終止。 而且我有例外,但是它被抓住了,並且不要去外面投擲作用。 該函數拋出AsynchronousCloseException,因爲它掛在channel.read(readBuffer);當連接關閉時,異常拋出並被捕獲。

問題是如何讓THREADSUPERVISER工作,不管任何拋出和處理的異常。

調試輸出:

  • 維持性推出2017-08-30T14:03:05.504Z //啓動並完成預期
  • 維持性完成2017-08-30T14:03:05.566Z
  • 輸出:FTPConnection ID:176 220服務就緒。
  • ......
  • 輸出:FTPConnection ID:190 226文件存儲135字節。
  • 關閉數據套接字:FTP連接190,/ 0:0:0:0:0:0:0:1:1409
  • maintance已啓動2017-08-30T14:03:25.581Z //啓動並完成預計
  • 維護完成2017-08-30T14:03:25.581Z
  • 異步異常錯誤讀取。 //有例外
  • 維持性推出2017-08-30T14:03:45.596Z //推出,但沒有完成,不會再運行
  • 輸出:FTPConnection ID:176 221超時超標,關閉控制和數據連接。
  • 關閉數據插座:FTP連接176,/ 0:0:0:0:0:0:0:1:1407

回答