2010-03-13 19 views
7

Tengo una aplicación web que se sincroniza con una base de datos central cuatro veces por hora. El proceso generalmente toma 2 minutos. Me gustaría ejecutar este proceso como un hilo en X: 55, X: 10, X: 25 y X: 40 para que los usuarios lo sepan en X: 00, X: 15, X: 30 y X: 45 tienen una copia limpia de la base de datos. Solo se trata de gestionar las expectativas. He pasado por el ejecutor en java.util.concurrent pero la programación se hace con el scheduleAtFixedRate que, en mi opinión, no proporciona ninguna garantía sobre cuándo se ejecuta realmente en términos de horas. Podría usar un primer retraso para iniciar el Runnable de manera que el primero esté cerca del tiempo de inicio y el programa por cada 15 minutos, pero parece que esto probablemente divergerá en el tiempo. ¿Hay alguna manera más fácil de programar el hilo para que se ejecute 5 minutos antes de cada cuarto de hora?Ejecutar hilo de Java en momentos específicos

Respuesta

9

Puede dejar que Runnable programe su "próxima ejecución".

Tales como,

class Task implements Runnable { 
    private final ScheduledExecutorService service; 

    public Task(ScheduledExecutorService service){ 
     this.service = service; 
    } 

    public void run(){ 
     try{ 
      //do stuff 
     }finally{ 
      //Prevent this task from stalling due to RuntimeExceptions. 
      long untilNextInvocation = //calculate how many ms to next launch 
      service.schedule(new Task(service),untilNextInvocation,TimeUnit.MILLISECONDS); 
     } 
    } 
} 
+0

Dit de esta manera y está trabajando muy bien. Gracias. – rmarimon

+1

@rmarimon: NP :) Solo tenga cuidado de que 'RuntimeException' pueda detener la ejecución periódica. Me quemé por esto, así que edité la respuesta en consecuencia. –

+0

Lo acabo de cambiar. Lo tuve como try {} catch (Exception e) {} y luego reprogramé. Pero finalmente parece el enfoque correcto. – rmarimon

1

TimerTask se encarga de este caso.

Ver schedule(TimerTask, Date)

Si no quieren tener que mantener la programación de los puestos de trabajo, es posible que desee ver en una herramienta de planificación de tareas como Quartz.

2

Quartz sería una buena opción ya que su aplicación se basa en la web. Proporcionará la programación basada en el tiempo precisa que necesita.

El cuarzo es una fuente con todas las funciones, abierta servicio de programación trabajo que puede ser integrado con, o usarse junto prácticamente cualquier EE Java o Java SE aplicación - desde la más pequeña aplicación independiente para el mayor sistema de comercio electrónico . Se puede usar Quartz para crear planificaciones simples o complejas para ejecutar decenas, cientos o incluso decenas de miles de trabajos; trabajos cuyas tareas se definen como componentes estándar de Java que pueden ejecutarse virtualmente cualquier cosa que usted pueda programar que hagan. El programador de Quartz incluye muchas características de clase empresarial , como JTA transacciones y clustering.

Cuestiones relacionadas