2012-01-05 17 views
8
new Timer().scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     System.out.println("run"); 
     throw new SomeRandomException(); 
    } 
}, 1000, 1000); 

Salida: ejecución (excepción es lanzada)Java Timer clase: tareas temporizador de parada para ejecutar si en una de las tareas excepción es lanzada

aquí está el problema: Necesito una tarea temporizador para comprobar específica condiciones en la base de datos (o algo más). Funcionó bien, pero a veces la base de datos (u otra cosa) devuelve algunos errores, se lanza una excepción y el temporizador falla, y luego no se ejecuta ninguna tarea del temporizador nuevamente. ¿Hay alguna implementación del temporizador que continúe funcionando después de que se arroje la excepción en run()?

que pueda

new Timer().scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     try { 
      System.out.println("run"); 
      throw new SomeRandomException(); 
     } catch (Exception e) { 
      System.out.println("dummy catch"); 
     } 
    } 
}, 1000, 1000); 

pero esto parece poco convincente.

Otra alternativa es escribir mi propia implementación de la clase del temporizador, tragando excepciones del método de ejecución (que tampoco parece correcto).

+0

Es necesario coger 'Error's tan bien o que en silencio mata a su tarea también. –

Respuesta

7

Utilice un ScheduledExecutorService. Juega el mismo papel que Timer, pero corrige sus puntos débiles (como el que te encuentras).

+0

Desafortunadamente "Si cualquier ejecución de la tarea encuentra una excepción, las ejecuciones posteriores se suprimen". - desde http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit) – fiction

+1

Sí, esta tarea en particular dejará de ejecutarse, pero no hará que el ejecutor falle, y otras tareas todavía están programadas. Pero estoy de acuerdo en que todavía debe detectar cualquier excepción que pueda suceder y no debe interrumpir la programación de la tarea. Es posible que desee crear una clase reutilizable CatchAllRunnable. –

0

Al utilizar ExecutorService; puede manejar el tiempo de compilación y ejecutar excepciones.

Handling exceptions from Java ExecutorService tasks
How is exception handling done in a Callable

ThreadPoolExecutor.java 

final void runWorker(Worker w) { 
    Thread wt = Thread.currentThread(); 
    Runnable task = w.firstTask; 
    w.firstTask = null; 
    w.unlock(); // allow interrupts 
    boolean completedAbruptly = true; 
    try { 
     while (task != null || (task = getTask()) != null) { 
      w.lock(); 
      // If pool is stopping, ensure thread is interrupted; 
      // if not, ensure thread is not interrupted. This 
      // requires a recheck in second case to deal with 
      // shutdownNow race while clearing interrupt 
      if ((runStateAtLeast(ctl.get(), STOP) || 
       (Thread.interrupted() && 
        runStateAtLeast(ctl.get(), STOP))) && 
       !wt.isInterrupted()) 
       wt.interrupt(); 
      try { 
       beforeExecute(wt, task); 
       Throwable thrown = null; 
       try { 
        task.run(); 
       } catch (RuntimeException x) { 
        thrown = x; throw x; 
       } catch (Error x) { 
        thrown = x; throw x; 
       } catch (Throwable x) { 
        thrown = x; throw new Error(x); 
       } finally { 
        afterExecute(task, thrown); 
       } 
      } finally { 
       task = null; 
       w.completedTasks++; 
       w.unlock(); 
      } 
     } 
     completedAbruptly = false; 
    } finally { 
     processWorkerExit(w, completedAbruptly); 
    } 
} 
Cuestiones relacionadas