Las excepciones no controladas con ejecutores de Java programadas
-
12-09-2019 - |
Pregunta
Tengo el siguiente problema y me gustaría saber qué pasa exactamente. Estoy utilizando ScheduledExecutorService para ejecutar una tarea cada cinco minutos. Funciona muy bien. Ejecutores cambiado completamente la forma en que hago la programación hilo en Java.
Ahora, me levantase de Java Doc para obtener información sobre lo que sería el comportamiento en caso de que la tarea programada falla con una excepción no controlada, pero no pude encontrar nada.
es la próxima tarea programada todavía va a funcionar? Si hay una excepción no controlada, el ejecutor programado deja de programación de tareas? ¿Alguien puede apuntar a la información sobre este sencillo problema?
Muchas gracias.
Solución
El Javadoc de ambos scheduleAtFixedRate
y scheduleWithFixedDelay
dice: "Si alguno ejecución de la tarea encuentra una excepción, las ejecuciones posteriores se suprimen." No me parece que eso sea exactamente claro como el cristal, pero parece estar diciendo que si su método run
lanza cualquier tipo de excepción, a continuación, el programador se reducirá efectivamente esa tarea. Cualesquiera otras tareas que se ejecutan a través del planificador que no deben verse afectadas. No debería ser difícil de probar lo que realmente hace ...
La cancelación de la tarea puede no ser necesariamente una mala cosa. Si el método de ejecución lanza una RuntimeException
, que probablemente tiene un error en alguna parte, y se desconoce el estado del sistema. Pero, como mínimo, yo le aconsejaría captura RuntimeException
en su método run, y el registro de la traza completa a grave. Es posible que desee a continuación, volver a lanzar para cancelar la tarea, dependiendo de las circunstancias. Pero de cualquier manera debes contar con la tala de tener la oportunidad de luchar de elaboración de lo que salió mal.
Otros consejos
Si está utilizando scheduleAtFixedRate()
o scheduleAtFixedDelay()
, y su tarea rescata con una excepción, no se volverá a programar la tarea. Sin embargo, otras tareas independientes deben continuar ejecutando según lo esperado. (Véase API Docs ). Si usted se preocupa de que esto ha sucedido, se puede agarrar Ahold de la ScheduledFuture
que se devuelve y llame al método get()
. Si la tarea subyacente lanza una excepción, lo tendrá expulsado del método get()
, envuelto en una ExecutionException
.
Este hombre tenía 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);
}
Parece que la API no define ningún mecanismo de manejo de excepciones específicas. Es decir. excepción no detectada apenas hace estallar a través de los marcos de rosca y con el tiempo se está registrando en stderr.
veo que se puede explotar las siguientes estrategias de manejo de excepciones:
- Definir el manejador en la clase de la tarea que los objetos son sometidos a enhebrar la piscina;
- ThreadFactory aplicación de subprocesos que inicializa controlador predeterminado a través de setUncaughtExceptionHandler () o de ThreadGroup uncaughtException () ;