2011-09-07 4 views
2

Je travaille sur une application multithread dans Java 5. Quand il s'exécute il commence plusieurs services d'exécuteur et il doit fonctionner pendant très longtemps. J'ai un service de surveillance qui vérifie l'état de chaque exécuteur créé. J'ai lu que le service d'exécuteur testamentaire ne peut avoir les états suivants:Surveillance et redémarrage du service d'exécution et de la tâche future?

  • en cours d'exécution,
  • arrêter et
  • terminé.

Dans le cas où quelque chose d'étrange se produit lors de l'exécution, je sous-classé mon FutureTask classe et overriden les méthodes:

  • setException et,
  • fait (quelque chose d'inhabituel comme ExecutionException et InterruptedException sont ici)

J'ai un cas où un service Executor lève une ExecutionException (dans ma propre classe FutureTask). L'ExecutionException est interceptée et enregistrée, mais mon service d'exécution ne se connecte plus à rien. Mon service de surveillance sort le service d'exécution est toujours en vie. Peut-être que cela a à voir avec le fait que ma FutureTask a atteint l'état fait?

  1. Quelle est la meilleure façon de gérer cela?
  2. Est-il possible de redémarrer le service d'exécution?
  3. Il semble que l'état FutureTask affecte le service Executor, puis-je utiliser l'état de FutureTask pour connaître l'état du service Executor?

Merci pour votre aide,

Répondre

1

exception manipulation En général est mieux fait par la tâche elle-même. Si votre tâche génère une exception, elle est terminée même si c'est une tâche planifiée (elle ne sera pas exécutée à nouveau). En fait, s'il y a un travail que vous voulez faire une fois la tâche terminée, il est souvent préférable de faire le même travail dans la tâche. c'est-à-dire qu'il ne revient que lorsqu'il n'y a presque plus rien à faire.

EDIT: Pour empêcher une tâche récurrente de mourir, vous pouvez utiliser un bloc try/catch.

Runnable run = new Runnable() { 
    public void run() { 
     try { 
      // do something which might throw an Exception 
     } catch(Exception e) { 
      log.error(e); 
     } 
    } 
}; 
scheduledExecutorService.scheduleAtFixedRate(run, delay, period, unit); 

Si vous ne surprenez pas l'exception et ouvrez une session, il sera stocké dans le FutureTask et vous devez vous rappeler de l'enregistrer là-bas et redémarrer la tâche se rappeler à quelle fréquence il Runt tâche. BTW: Une tâche n'a pas d'impact sur l'état d'un ExecutorService, sauf si une référence l'appelle directement. BTW2: Avec la sortie de Java 7, plus de cinq ans après Java 6, il est temps d'envisager de migrer à partir de Java 5.0, qui est en fin de vie depuis plus de trois ans.

+0

Merci pour votre réponse et vos conseils Peter. Par Java 5, je voulais dire que j'utilisais la nouvelle architecture d'exécuteur. Ma version de Java et est 6.0. Vous avez parfaitement raison de garder le travail jvm à jour. J'ai également résolu mon problème, il semble fonctionner: j'ai ajouté une ligne dans le moniteur pour vérifier l'état fait du futuretask et si c'est vrai alors je soumet de nouveau le futuretask à l'exécuteur. – Alain

+0

@Alain, il est assez simple de s'assurer qu'il ne meurt pas en premier lieu. ;) –

Questions connexes