2009-11-02 19 views
25

Tengo el siguiente problema y me gustaría saber qué ocurre exactamente. Estoy usando Java ScheduledExecutorService para ejecutar una tarea cada cinco minutos. Funciona muy bien. Los ejecutores cambiaron por completo la forma en que hago la programación de subprocesos en Java.Excepciones no controladas con ejecutores programados Java

Ahora, busqué Java Doc para obtener información sobre cuál sería el comportamiento en caso de que la tarea programada falle con una excepción no controlada, pero no pudo encontrar nada.

¿La próxima tarea programada aún se va a ejecutar? Si hay una excepción no controlada, ¿el ejecutor programado detiene la tarea de programación? ¿Alguien puede señalar información con respecto a este simple problema?

Muchas gracias.

Respuesta

24

El Javadoc de scheduleAtFixedRate y scheduleWithFixedDelay dice "Si cualquier ejecución de la tarea encuentra una excepción, las ejecuciones subsiguientes se suprimen". No creo que sea exactamente claro, pero parece decir que si su método run arroja algún tipo de excepción, el programador abandonará esa tarea. Cualquier otra tarea que se ejecute a través de ese programador no debería verse afectada. No debería ser difícil probar lo que realmente hace ...

La cancelación de la tarea puede no ser necesariamente algo malo. Si el método de ejecución arroja un RuntimeException, es probable que tenga un error en alguna parte, y se desconoce el estado del sistema. Pero, como mínimo, le aconsejo que capture RuntimeException en su método de ejecución y que registre el seguimiento completo de la pila en SEVERE. Es posible que desee volver a lanzar para cancelar la tarea, según las circunstancias. Pero de cualquier forma, necesitarás que el registro tenga la oportunidad de resolver lo que salió mal.

+0

Gracias mucho por la respuesta. No vi eso en API Doc. –

+5

Una exploración rápida de la fuente de ThreadPoolExecutor (encima de la cual se implementa el STPE) sugiere que RuntimeExceptions se detectará perfectamente y se informará a través de ScheduledFuture, pero también hará que termine el subproceso de trabajo. El TPE notará esta terminación del hilo del trabajador y activará un nuevo reemplazo, si es necesario. Consulte runWorker() y processWorkerExit() en java.util.concurrent.ThreadPoolExecutor en las fuentes de JDK, o en el sitio de Doug Lea. – andersoj

11

Si usa scheduleAtFixedRate() o scheduleAtFixedDelay(), y su tarea se resuelve con una excepción, esa tarea no se reprogramará. Sin embargo, otras tareas independientes deben continuar ejecutándose según lo esperado. (Ver API Docs). Si le importa que esto haya ocurrido, puede obtener el ScheduledFuture que se devuelve y llamar al método get(). Si la tarea subyacente arroja una excepción, la eliminará del método get(), envuelto en un ExecutionException.

+0

Muchas gracias por la respuesta. +1. Lástima que no puedo aceptar dos respuestas como "la respuesta". Gracias de nuevo. –

+0

Oye, amigo, Lachlan me ganó al golpe ... las reglas son reglas. ;-) – andersoj

+0

Extraño ... mi parada sucesiva también. –

-3

Parece que la API no define ningún mecanismo específico de manejo de excepciones. Es decir. excepción no detectada simplemente aparece a través de los marcos de subprocesos y, finalmente, se registra en stderr.

veo que se puede explotar las siguientes estrategias de manejo de excepciones:

+0

No creo que se registren estas excepciones. –

1

Este hombre tuvo el mismo problema.

http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/

Su solución es coger Exception dentro del ejecutable y volver a lanzar una RuntimeException:

try { 
     theRunnable.run(); 
    } catch (Exception e) { 
     // LOG IT HERE!!! 
     System.err.println("error in executing: " + theRunnable + ". It will no longer be run!"); 
     e.printStackTrace(); 

     // and re throw it so that the Executor also gets this error so that it can do what it would 
     // usually do 
     throw new RuntimeException(e); 
} 
Cuestiones relacionadas