Schedulare dei timer con Spring @Scheduled e Quartz

Vediamo come realizzare dei timer nella nostra applicazione sfruttando due diverse modalità richiamabili dalla nostra applicazione Spring.

@Scheduled

Utilizzando questa annotation possiamo accedere direttamente alle API messe a disposizione da Spring senza dover ricorrere a librerie di terze parti. L’annotation deve essere semplicemente messa sul metodo di un componente Spring che desideriamo richiamare in maniera schedulata e dobbiamo poi configurarla attraverso i diversi parametri che vengono messi a disposizione. Se vogliamo utilizzare una classica espressione crontab dobbiamo specificare il parametro cron. Ad esempio per richiamare un metodo ogni volta che cambia l’ora possiamo utilizzare il seguente codice

Per avviare invece un metodo ogni intervallo di tempo fisso dobbiamo utilizzare il parametro fixedRate

Con il precedente esempio potrebbe succedere di avere dei metodi che vengono eseguiti in maniera concorrente, visto che l’esecuzione potrebbe durare più a lungo rispetto all’intervallo selezionato. Se questa cosa può crearci dei problemi possiamo optare per la configurazione dove invece definiamo l’intervallo di tempo che intercorre tra due diverse esecuzioni attraverso l’intervallo fixedDelay

Oltre a fixedDelay è possibile anche definire initialDelay che è l’intervallo di tempo che si attende inizialmente quando il bean viene creato

L’annotation @Scheduled sotto in realtà maschera l’implementazione di Spring con TaskExecutor e TaskScheduler, che può essere utilizzata nel caso si volesse creare qualcosa di più raffinato e specifico. Per maggiori informazioni potete vedere la documentazione ufficiale su questa tematica

Spring Boot e Quartz

Quartz è una libreria opensource che permette di definire e gestire la schedulazione di job. In questo esempio vedremo come integrarlo con Spring eseguendo un semplice job, ma ovviamente Quartz rispetto al semplice meccanismo dell’annotation Scheduled permette svariate opzioni che possono essere utili nella definizione dei timer

1) Persistenza dei job
2) Transazioni
3) Clustering
4) Trigger e listener configurabili

Passiamo al nostro semplice esempio dove definiamo una classe MioJob che implementa l’interfaccia Job di Quartz

Il metodo che verrà schedulato periodicamente è execute e in base alla configurazione che abbiamo definito verrà eseguito ogni X secondi dove X è il valore della proprietà quartz.miojob.intervallo. Questa classe è il Job che verrà eseguito, però per agganciare questa classe all’infrastruttura di Quartz dobbiamo prima di tutto definire alcune informazioni essenziali che possiamo riportare nel file quartz.properties

In questo modo abbiamo definito che ci sarà un pool di 5 Thread (anche se nello specifico non ci serviranno) e il repository dei job sarà il RAMJobStore, ovvero che tutte le informazioni dei job saranno gestite in memoria. Quest’ultima configurazione è molto importante in quanto possiamo decidere di utilizzare un repository dei job che vada a memorizzare le informazioni relative all’esecuzione sul database. Utilizzando quindi un jobStore come JDBCJobStore avremo sempre memorizzato sul db quello che sta succedendo durante l’esecuzione dei nostri job, anche se l’applicazione viene riavviata.

Tornando al nostro esempio, visto che stiamo utilizzando Spring Boot, definiremo una classe di tipo @Configuration che ci servirà per creare diverse factory necessarie per inserire il nostro Job nel ciclo di vista di Quartz

Nel progetto Github che segue potete trovare entrambi gli esempi utilizzati, lanciarli tramite la classe ApplicationStarter che mette in moto il contesto con Spring Boot e ci permette di verificare i due esempi

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *