Le service sur lequel je travaille utilise un Future pour exécuter plusieurs tâches en parallèle ; chaque tâche peut prendre jusqu'à une minute. Cependant, il semble que la librairie externe soit boguée, puisque dans certaines occasions (2% du temps), elle ne revient pas. Dans ces cas-là, je voudrais donner un temps d'attente de 2 minutes, et s'il n'est pas revenu, je voudrais tuer le futur et le reprogrammer plus tard (il finira par réussir).
Comment je tue le futur ?
private void run() {
ExecutorService queue = Executors.newFixedThreadPool(1);
Future<Integer> f = queue.submit(new MyTask());
Thread.sleep(500);
try {
Integer r = f.get(120, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
f.cancel(true);
}
// Bad future still running here and I need it dead.
}
private class MyTask implements Callable<Integer> {
private ExternalLibrary extlib = new ExternalLibrary();
@Override
public Integer call() throws Exception {
// step 1 - do a few things
// step 2 - process data
Integer val = this.extlib.doSomething(); // here's the problem!
// step 3 - do other things
return val;
}
}
Je peux voir la librairie externe fonctionner et consommer du CPU (pendant 24 heures)... sans rien faire. C'est une tâche simple qui ne devrait jamais prendre plus de 60 secondes pour accomplir son travail.
Pour l'instant, je tue toute la JVM une fois par jour pour me débarrasser de ce problème, mais je suis sûr qu'il doit y avoir un meilleur moyen. Je me demande comment les serveurs d'applications (Tomcat, JBoss, Weblogic, etc.) font avec les processus rebelles.