Gestion des exceptions pour ThreadPoolExecutor
J'ai l'extrait de code suivant que, fondamentalement, balaie la liste de la tâche qui doit être exécutée et chaque tâche est alors donné à l'exécuteur testamentaire pour l'exécution.
La JobExecutor
crée à son tour un autre exécuteur testamentaire (pour faire des db choses...de la lecture et de l'écriture des données en file d'attente) et termine la tâche.
JobExecutor
renvoie une Future<Boolean>
pour les tâches soumises. Lorsque l'un d'échec de la tâche, je veux gracieusement interrompre tous les threads et de l'arrêt de l'exécuteur testamentaire par l'attraper toutes les exceptions. Quels changements dois-je faire?
public class DataMovingClass {
private static final AtomicInteger uniqueId = new AtomicInteger(0);
private static final ThreadLocal<Integer> uniqueNumber = new IDGenerator();
ThreadPoolExecutor threadPoolExecutor = null ;
private List<Source> sources = new ArrayList<Source>();
private static class IDGenerator extends ThreadLocal<Integer> {
@Override
public Integer get() {
return uniqueId.incrementAndGet();
}
}
public void init(){
//load sources list
}
public boolean execute() {
boolean succcess = true ;
threadPoolExecutor = new ThreadPoolExecutor(10,10,
10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1024),
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("DataMigration-" + uniqueNumber.get());
return t;
}//End method
}, new ThreadPoolExecutor.CallerRunsPolicy());
List<Future<Boolean>> result = new ArrayList<Future<Boolean>>();
for (Source source : sources) {
result.add(threadPoolExecutor.submit(new JobExecutor(source)));
}
for (Future<Boolean> jobDone : result) {
try {
if (!jobDone.get(100000, TimeUnit.SECONDS) && success) {
//in case of successful DbWriterClass, we don't need to change
//it.
success = false;
}
} catch (Exception ex) {
//handle exceptions
}
}
}
public class JobExecutor implements Callable<Boolean> {
private ThreadPoolExecutor threadPoolExecutor ;
Source jobSource ;
public SourceJobExecutor(Source source) {
this.jobSource = source;
threadPoolExecutor = new ThreadPoolExecutor(10,10,10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1024),
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("Job Executor-" + uniqueNumber.get());
return t;
}//End method
}, new ThreadPoolExecutor.CallerRunsPolicy());
}
public Boolean call() throws Exception {
boolean status = true ;
System.out.println("Starting Job = " + jobSource.getName());
try {
//do the specified task ;
}catch (InterruptedException intrEx) {
logger.warn("InterruptedException", intrEx);
status = false ;
} catch(Exception e) {
logger.fatal("Exception occurred while executing task "+jobSource.getName(),e);
status = false ;
}
System.out.println("Ending Job = " + jobSource.getName());
return status ;
}
}
}
source d'informationauteur jagamot
Vous devez vous connecter pour publier un commentaire.
Lorsque vous envoyez une tâche de l'interprète, il vous renvoie un
FutureTask
instance.FutureTask.get()
re-jeter une exception levée par la tâche comme unExecutorException
.Ainsi, lorsque vous parcourez la
List<Future>
et appel d'obtenir sur chaque, attraperExecutorException
et invoquer un arrêt ordonné.Depuis que vous êtes à la soumission de tâches à
ThreadPoolExecutor
à l'exception de l'obtention d'ingestion parFutureTask
.Jetez un oeil à cette code
}
De code ci-dessus, il est clair que
setException
méthode de captureThrowable
. Pour cette raison,FutureTask
est à avaler toutes les exceptions si vous utilisez "submit()
" méthode àThreadPoolExecutor
Comme par java la documentationvous pouvez étendre
afterExecute()
méthode dansThreadPoolExecutor
Exemple de code selon la documentation:
Vous pouvez attraper
Exceptions
de trois façonsFuture.get()
comme le suggère accepté de répondre àrun()
oucall()
méthode danstry{}catch{}Exceptoion{}
blocsafterExecute
deThreadPoolExecutor
méthode comme indiqué ci-dessusGracieusement à interrompre les autres Threads, regardez ci-dessous SE question:
Comment arrêter à côté de threads de s'exécuter dans un ScheduledThreadPoolExecutor
Comment faire pour forcer l'arrêt de java ExecutorService
Sous-classe
ThreadPoolExecutor
et de remplacer sonprotected afterExecute (Runnable r, Throwable t)
méthode.Si vous êtes à la création d'un pool de threads via le
java.util.concurrent.Executors
commodité de classe (que vous ne l'êtes pas), prendre à chercher à sa source pour voir comment c'est en invoquant ThreadPoolExecutor.