
Spring Boot | Task scheduling
In questo nuovo appuntamento con Spring Boot vedremo come pianificare l'esecuzione di task direttamente all'interno di un'applicazione con un minimo sforzo di programmazione.
Sono diverse le situazioni in cui può essere utile ricorrere a questo genere di pianificazioni, per esempio quando abbiamo la necessità di prelevare dei dati da un web service piuttosto che da una cartella ftp oppure esportare dei file e così via.
Partiamo da un progetto di base che possiamo creare online con Spring Initializr o con il plugin STS in Eclipse o con altre soluzioni messe a disposizione dai vari IDE.
Non sono richieste specifiche dipendenze all'interno del file pom.xml.
Occorre solo aggiungere l'annotazione @EnableScheduling
nella classe principale
@EnableScheduling
@SpringBootApplication
public class TaskSchedulerApplication {
public static void main(String[] args) {
SpringApplication.run(TaskSchedulerApplication.class, args);
}
}
Creiamo un package taskscheduler e al suo interno una classe ScheduledTasks
che utilizzeremo per provare i vari metodi pianificati.
Questa classe deve essere annotata con @Component
per essere gestita direttamente da Spring.
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 3000)
public void ScheduledTaskWithFixedRate() {
System.out.println("Executed task with fixed rate at " + LocalDateTime.now());
}
@Scheduled(fixedDelay = 6000)
public void ScheduledTaskWithFixedDelay() {
System.out.println("Executed task with fixed delay at " + LocalDateTime.now());
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException ex) {
throw new IllegalStateException(ex);
}
}
@Scheduled(fixedRate = 2000, initialDelay = 4000)
public void ScheduleTaskWithInitialDelay() {
System.out.println("Executed task with initial delay at " + LocalDateTime.now());
}
@Scheduled(cron = "0 * * * * ?")
public void ScheduleTaskWithCron() {
System.out.println("Executed task with Cron at " + LocalDateTime.now());
}
}
Per quanto riguarda lo scheduler i metodi, la cui esecuzione può essere pianificata, devono avere delle caratteristiche particolari e cioè:
- devono essere metodi pubblici
- non devono restituire alcun valore o meglio restituire
void
- non devono accettare parametri
Le opzioni di pianificazione dipendono dagli attributi che andiamo a specificare all'interno dell'annotazione @Scheduled
associata al metodo da programmare.
Con fixedRate
il metodo viene eseguito ad intervalli regolari la cui durata è specificata in millisecondi.
Ad esempio con
@Scheduled(fixedRate = 3000)
public void ScheduledTaskWithFixedRate() {
System.out.println("Executed task with fixed rate at " + LocalDateTime.now());
}
il metodo sarà eseguito ogni 3 secondi (3000 millisecondi).
Il fixedDelay
consente di impostare un ritardo prefissato rispetto al completamento della precedente esecuzione.
Ad esempio con
@Scheduled(fixedDelay = 6000)
public void ScheduledTaskWithFixedDelay() {
System.out.println("Executed task with fixed delay at " + LocalDateTime.now());
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException ex) {
throw new IllegalStateException(ex);
}
}
simuliamo un'esecuzione che dura 5 secondi ma in cui la successiva attende 6 secondi prima del suo avvio.
Quindi possiamo combinare fixedRate
con initialDelay
in modo che che le esecuzioni avvengano sempre ad intervalli regolari, ma ritardando esclusivamente la prima.
@Scheduled(fixedRate = 2000, initialDelay = 4000)
public void ScheduleTaskWithInitialDelay() {
System.out.println("Executed task with initial delay at " + LocalDateTime.now());
}
Infine citiamo un'opzione molto interessante che permette di utilizzare il formato di cron, uno degli scheduler più noti in ambiente Linux. In questo caso andremo semplicemente ad impostare il formato di cron per determinare come e quando eseguire il metodo.
@Scheduled(cron = "0 * * * * ?")
public void ScheduleTaskWithCron() {
System.out.println("Executed task with Cron at " + LocalDateTime.now());
}
Per fortuna non occorre imparare a memoria la sintassi ma si può utilizzare un ottimo strumento online, Crontab Generator (https://crontab-generator.org/), con cui possiamo impostare i parametri richiesti (data, ora, giorno della settimana, mese, ecc.) ed ottenere la corrispondente stringa da utilizzare con l'attributo cron
.
Per testare la nostra applicazione basta eseguirla con il solito mvn spring-boot:run
da riga di comando oppure farla partire dall'IDE.
Nei log è possibile vedere come i tempi di esecuzione dei vari metodi dipendono dalle diverse impostazioni.
[VIDEO YOUTUBE]
[LINKS]