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.

¿Fue útil?

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:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top