scheduled - ¿Cómo programar una tarea periódica en Java?
timer.schedule java (7)
Deberías echarle un vistazo a Quartz , es un framework java que funciona con ediciones EE y SE y permite definir trabajos para ejecutar un horario específico
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
. ¿ java.util.Timer.scheduleAtFixedRate
admite largos intervalos de tiempo?
Prueba de esta manera ->
Primero crea una clase TimeTask que ejecute tu 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 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));
}
Si desea seguir con java.util.Timer
, puede usarlo para programar a intervalos de tiempo grandes. Simplemente pase en el período que está disparando. Verifique la documentación here .
Si su aplicación ya está utilizando Spring Framework, tiene Scheduling incorporada
Use un ScheduledExecutorService :
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
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, entonces registrar todos los servicios en ServiceManager será bueno ya que todos los servicios se pueden iniciar y detener juntos. Lea here para obtener más información sobre ServiceManager.
Yo uso la función de Spring Framework. ( contenedor de contexto de primavera o dependencia de 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 de ejecución , que llamo mi tarea programada.