簡體   English   中英

ScheduledThreadPoolExecutor停止執行並捕獲異常

[英]ScheduledThreadPoolExecutor stops executing with caught exceptions

我有以下課程

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服務器),檢查連接是否沒有傳輸任何數據並且空閑了一段時間,如果是則關閉連接。 問題在於任務永遠不會在中斷線程中引發某些異常后運行。 我知道它是用docs編寫的。如果任務的任何執行遇到異常,都會抑制后續執行。 否則,任務將僅通過取消或終止執行程序而終止。 而且我有一個例外,但是它被捕獲了並且不要在throwing函數之外。 此函數引發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
  • 維護已啟動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

事實證明,問題出在

 ACTIVECONNECTIONS.remove(connection);

我有ConcurrentModifyingException。 http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/中的解決方案效果很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM