specific scheduled example ejemplo detener java scheduled-tasks

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.