¿Cómo programar una tarea periódica en Java?
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)?
Actualmente estoy usando java.util.Timer.scheduleAtFixedRate
. ¿ Admite java.util.Timer.scheduleAtFixedRate
largos intervalos de tiempo?
Utilice un ScheduledExecutorService :
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
Deberías echarle un vistazo a Quartz , es un framework java que funciona con las ediciones EE y SE y permite definir trabajos para ejecutar en un tiempo específico.
Prueba de esta manera ->
En primer lugar, cree una clase TimeTask que ejecute su tarea, se ve así:
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());
}
}
}
Luego, en la clase principal, crea una instancia de la tarea y la ejecuta periódicamente iniciada en una fecha precisa:
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));
}
Utilice Google Guava AbstractScheduledService
como se indica 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 tiene más servicios como este, será bueno registrar todos los servicios en ServiceManager, ya que todos los servicios se pueden iniciar y detener juntos. Lea aquí para obtener más información sobre ServiceManager.
Si desea seguir con java.util.Timer
, puede usarlo para programar en intervalos de tiempo grandes. Simplemente pasas el período al que estás apuntando. Consulta la documentación aquí .