Una guida allo Spring Task Scheduler

1. Panoramica

In questo articolo, discuteremo i meccanismi di pianificazione delle attività di Spring : TaskScheduler e le sue implementazioni predefinite insieme ai diversi trigger da utilizzare. Se vuoi saperne di più sulla pianificazione in primavera, controlla gli articoli @Async e @Scheduled .

TaskScheuler è stato introdotto nella primavera 3.0 con una varietà di metodi da eseguire in futuro, restituisce anche un oggetto di rappresentazione dell'interfaccia ScheduledFuture , che potrebbe essere utilizzato per annullare l'attività pianificata o verificare se è stata eseguita o meno.

Tutto ciò che dobbiamo fare è selezionare un'attività eseguibile per la pianificazione, quindi selezionare una politica di pianificazione appropriata.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler è adatto per la gestione dei thread interni, in quanto delega le attività a ScheduledExecutorService e implementa l' interfaccia TaskExecutor , in modo che una singola istanza sia in grado di gestire potenziali esecuzioni asincrone così come l' annotazione @Scheduled .

Vediamo ora definiscono ThreadPoolTaskScheduler fagiolo a ThreadPoolTaskSchedulerConfig :

@Configuration @ComponentScan( basePackages="com.baeldung.taskscheduler", basePackageClasses={ThreadPoolTaskSchedulerExamples.class}) public class ThreadPoolTaskSchedulerConfig { @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(5); threadPoolTaskScheduler.setThreadNamePrefix( "ThreadPoolTaskScheduler"); return threadPoolTaskScheduler; } }

Il bean configurato threadPoolTaskScheduler può eseguire attività in modo asincrono in base alla dimensione del pool configurato di 5.

Si noti che tutti i nomi dei thread correlati a ThreadPoolTaskScheduler avranno il prefisso ThreadPoolTaskScheduler .

Implementiamo una semplice attività che possiamo quindi programmare:

class RunnableTask implements Runnable{ private String message; public RunnableTask(String message){ this.message = message; } @Override public void run() { System.out.println(new Date()+" Runnable Task with "+message +" on thread "+Thread.currentThread().getName()); } } 

Ora possiamo semplicemente pianificare questa attività in modo che venga eseguita dallo scheduler:

taskScheduler.schedule( new Runnabletask("Specific time, 3 Seconds from now"), new Date(System.currentTimeMillis + 3000) ); 

Il TaskScheduler programmerà questo compito eseguibile in una data nota, esattamente 3 secondi dopo l'ora attuale.

Andiamo ora un po 'più in profondità con i meccanismi di pianificazione di ThreadPoolTaskScheduler .

3. Pianifica attività eseguibile con ritardo fisso

La pianificazione con un ritardo fisso può essere eseguita con due semplici meccanismi:

3.1. Pianificazione dopo un ritardo fisso dell'ultima esecuzione pianificata

Configuriamo un'attività in modo che venga eseguita dopo un ritardo fisso di 1000 millisecondi:

taskScheduler.scheduleWithFixedDelay( new RunnableTask("Fixed 1 second Delay"), 1000);

Il RunnableTask verrà sempre eseguito 1000 millisecondi dopo tra il completamento di un'esecuzione e l'inizio di quella successiva.

3.2. Pianificazione dopo un ritardo fisso di una data specifica

Configuriamo un'attività in modo che venga eseguita dopo un ritardo fisso di una determinata ora di inizio:

taskScheduler.scheduleWithFixedDelay( new RunnableTask("Current Date Fixed 1 second Delay"), new Date(), 1000);

Il RunnableTask verrà richiamato al tempo di esecuzione specificato che principalmente il tempo in cui inizia il metodo @PostConstruct e successivamente con un ritardo di 1000 millisecondi.

4. Pianificazione a tasso fisso

Esistono due semplici meccanismi per la pianificazione di attività eseguibili a velocità fissa:

4.1. Pianificazione del RunnableTask a un tasso fisso

Pianifichiamo un'attività in modo che venga eseguita a una velocità fissa di millisecondi :

taskScheduler.scheduleAtFixedRate( new RunnableTask("Fixed Rate of 2 seconds") , 2000);

Il prossimo RunnableTask verrà eseguito sempre dopo 2000 millisecondi, indipendentemente dallo stato dell'ultima esecuzione che potrebbe essere ancora in esecuzione.

4.2. Pianificazione del RunnableTask a un tasso fisso da una determinata data

taskScheduler.scheduleAtFixedRate(new RunnableTask( "Fixed Rate of 2 seconds"), new Date(), 3000);

Il RunnableTask verrà eseguito 3000 millisecondi dopo l'ora corrente.

5. Pianificazione con CronTrigger

CronTrigger viene utilizzato per pianificare un'attività basata su un'espressione cron:

CronTrigger cronTrigger = new CronTrigger("10 * * * * ?"); 

Il trigger fornito può essere utilizzato per eseguire un'attività in base a una determinata cadenza o pianificazione specificata:

taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);

In questo caso, il RunnableTask verrà eseguito al decimo secondo di ogni minuto.

6. Pianificazione con PeriodicTrigger

Usiamo PeriodicTrigger per programmare un'attività con un ritardo fisso di 2000 millisecondi:

PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);

Il bean PeriodicTrigger configurato verrebbe utilizzato per eseguire un'attività dopo un ritardo fisso di 2000 millisecondi.

Ora programmiamo il RunnableTask con PeriodicTrigger :

taskScheduler.schedule( new RunnableTask("Periodic Trigger"), periodicTrigger);

Possiamo anche configurare PeriodicTrigger per essere inizializzato a una velocità fissa invece che a un ritardo fisso, inoltre possiamo impostare un ritardo iniziale per la prima attività pianificata di un dato millisecondo.

Tutto quello che dobbiamo fare è aggiungere due righe di codice prima dell'istruzione return nel bean periodicTrigger :

periodicTrigger.setFixedRate(true); periodicTrigger.setInitialDelay(1000);

We used the setFixedRate method to schedule the task at fixed rate rather than with a fixed delay, then setInitialDelay method is used to set initial delay only for the first runnable task to run.

7. Conclusion

In this quick article, we've illustrated how to schedule a runnable task using the Spring support for tasks.

We looked at running the task with a fixed delay, at a fixed rate and according to a specified trigger.

And, as always, the code is available as a Maven project over in GitHub.