0

J'ai une application qui utilise un ScheduledExecutorService pour gérer plusieurs Runnable: chacun est prévu à taux fixe et doit être être vivant aussi longtemps que l'application.Vérifier l'état des tâches planifiées

J'ai besoin d'une solution pour être notifié si l'un de ces threads est terminé pour une exception, afin que je puisse les planifier à nouveau. Puis-je utiliser un motif pour ce problème? Ou est-ce que j'utilise les mauvais objets dans ma demande?

+0

http://stackoverflow.com/questions/21442322/scheduledexecutorservice-check-if-scheduled-task-has-already-been-completed –

Répondre

0

Il pourrait être plus facile si vous simplement envelopper le Runnable afin que les exceptions ne causent jamais la tâche à annuler:

class CatchingRunnable implements Runnable { 
    private final Runnable delegate; 

    CatchingRunnable(Runnable delegate) { 
    this.delegate = delegate; 
    } 

    @Override public void run() { 
    try { 
     delegate.run(); 
    } catch (RuntimeException e) { 
     // Handle the exception somehow, e.g. log it. 
    } 
    } 
} 

Programmez maintenant runnable via:

executor.scheduleAtFixedRate(new CatchingRunnable(runnable), delay, period, unit); 

Ensuite, vous ne devez jamais inquiéter à propos de leur reprogrammation.

+0

Ceci est bien, mais il peut être difficile de prévoir toute sorte d'exception que vous pouvez avoir et gérer en conséquence. Suggestion: à partir du bloc '' 'catch''', rappeler à la classe qui a l'exécuteur et replanifier. Pour ce faire, vous aurez probablement une autre interface à la place de '' '' Runnable''' pour '' 'delegate''', qui a aussi une fonction (par exemple' '' recréer() '' ') pour recréer le même délégué . –

+0

@JornVernee bien, bien sûr, vous voudrez peut-être gérer des exceptions spécifiques de façon spécifique. Mais 1) comment géreriez-vous ces exceptions "inconnaissables" par d'autres moyens? 2) Si votre objectif est "s'il a échoué, redémarrez-le", le type de l'exception n'a pas d'importance. –

+0

Oui, mon point était le numéro 2, le type d'exception n'a pas d'importance. La suggestion était que le runnable se replie s'il se termine avec une exception. C'est tout. –

0

Vous pouvez également conserver un gestionnaire à resoumettre si ScheduleFuture se termine.