2011-10-18 7 views
117

Necesito programar una tarea para que se ejecute en un intervalo de tiempo fijo. ¿Cómo puedo hacer esto con soporte de intervalos largos (por ejemplo, cada 8 horas)?¿Cómo programar una tarea periódica en Java?

Actualmente estoy usando java.util.Timer.scheduleAtFixedRate. ¿Soporta java.util.Timer.scheduleAtFixedRate largos intervalos de tiempo?

Respuesta

165

Utilice un ScheduledExecutorService:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS); 
38

Usted debe echar un vistazo a Quartz es un marco de Java wich trabaja con EE y SE ediciones y permite definir los trabajos a ejecutar un tiempo específico

8

Si desea seguir con java.util.Timer, que se puede utilizar para programar a intervalos de tiempo grandes. Simplemente pase en el período que está disparando. Verifique la documentación here.

20

Trate de esta manera ->

crear en primer lugar una TimeTask clase que ejecutar su tarea, que parece:

public class CustomTask extends TimerTask { 

    public CustomTask(){ 

    //Constructor 

    } 

    public void run() { 
    try { 

     // Your task process 

      } catch (Exception ex) { 

     System.out.println("error running thread " + ex.getMessage()); 
    } 
} 

continuación, en la clase principal se crear una instancia de la tarea y ejecutarla periódicamente iniciada en una fecha específica:

public void runTask(){ 

     Calendar calendar = Calendar.getInstance(); 
     calendar.set(
      Calendar.DAY_OF_WEEK, 
      Calendar.MONDAY 
     ); 
     calendar.set(Calendar.HOUR_OF_DAY, 15); 
     calendar.set(Calendar.MINUTE, 40); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 



     Timer time = new Timer(); // Instantiate Timer Object 

     // Start running the task on Monday at 15:40:00, period is set to 8 hours 
     // if you want to run the task immediately, set the 2nd parameter to 0 
     time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8)); 
} 
+5

Para que el código sea más legible, puede cambiar el argumento final en la programación de llamada a TimeUnit.HOURS.toMillis (8) – darrenmc

8

Uso Google guayaba AbstractScheduledService se indican a continuación:

public class ScheduledExecutor extends AbstractScheduledService 
{ 
    @Override 
    protected void runOneIteration() throws Exception 
    { 
     System.out.println("Executing...."); 
    } 

    @Override 
    protected Scheduler scheduler() 
    { 
     return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS); 
    } 

    @Override 
    protected void startUp() 
    { 
     System.out.println("StartUp Activity...."); 
    } 


    @Override 
    protected void shutDown() 
    { 
     System.out.println("Shutdown Activity..."); 
    } 

    public static void main(String[] args) throws InterruptedException 
    { 
     ScheduledExecutor se = new ScheduledExecutor(); 
     se.startAsync(); 
     Thread.sleep(15000); 
     se.stopAsync(); 
    } 

}

Si usted tiene más servicios de este tipo, a continuación, el registro de todos los servicios en ServiceManager será bueno como todos los servicios se pueden iniciar y detener juntos . Lea here para obtener más información sobre ServiceManager.

+0

Guava está ahora en GitHub. Aquí hay un enlace a la nueva documentación de [ServiceManager] (https://github.com/google/guava/wiki/ServiceExplained). – Renato

4

Si la aplicación ya está utilizando framework Spring, se han construido en Scheduling

1

utilizo la función de primavera marco. (spring-context dependencia jar o maven).

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.scheduling.annotation.Scheduled; 
import org.springframework.stereotype.Component; 


@Component 
public class ScheduledTaskRunner { 

    @Autowired 
    @Qualifier("TempFilesCleanerExecution") 
    private ScheduledTask tempDataCleanerExecution; 

    @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */) 
    public void performCleanTempData() { 
     tempDataCleanerExecution.execute(); 
    } 

} 

ScheduledTask es mi propia interfaz con mi método personalizado ejecutar, que llamo como mi tarea programada.

Cuestiones relacionadas