2017-08-30 4 views
0

j'ai la classe suivanteScheduledThreadPoolExecutor arrête l'exécution des exceptions pris

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); 
    } 
} 

qui parcourt toutes les connexions FTP (parce que j'écris serveur FTP), vérifie si la connexion ne transmet aucune donnée et inactif pendant un certain temps et ferme la connexion si oui. Le problème est que la tâche ne s'exécute jamais après certaines exceptions lancées dans le thread d'interruption. Je sais qu'il est écrit dans les documents Si une exécution de la tâche rencontre une exception, les exécutions suivantes sont supprimées. Sinon, la tâche ne prendra fin que par l'annulation ou la résiliation de l'exécuteur. Et j'ai l'exception, mais il est pris et ne va pas à l'extérieur de lancer la fonction. Cette fonction lève AsynchronousCloseException car elle se bloque sur channel.read (readBuffer); et lorsque la connexion est fermée, l'exception est lancée et interceptée.

La question est de savoir comment faire fonctionner THREADSUPERVISER quelles que soient les exceptions levées et traitées.

sortie de débogage:

  • maintance lancé 2017-08-30T14: 03: 05.504Z // lancé et terminé comme prévu
  • maintance terminé 2017-08-30T14: 03: 05.566Z
  • output: FTPConnection id: 176 220 Service prêt.
  • ...
  • sortie: FTP ID de connexion: 190 226 Fichier stocké 135 octets.
  • prise de données de fermeture: connexion FTP 190,/0: 0: 0: 0: 0: 0: 1: 1409
  • maintance lancé 2017-08-30T14: 03: 25.581Z // lancé et fini comme attendu
  • maintance terminé 2017-08-30T14: 03: 25.581Z
  • lecture d'erreur d'exception asynchrone. // a obtenu l'exception
  • maintance lancée 2017-08-30T14: 03: 45.596Z // lancée, mais pas terminée et ne plus jamais fonctionner
  • sortie: FTP ID de connexion: 176 221 Délai dépassé, contrôle de fermeture et connexion de données.
  • prise de données de fermeture: connexion FTP 176,/0: 0: 0: 0: 0: 0: 0: 1: 1407

Répondre