L'annotazione @Scheduled in primavera

1. Panoramica

In questo tutorial, illustreremo come utilizzare l' annotazione Spring @Scheduled per configurare e pianificare le attività.

Le semplici regole che dobbiamo seguire per annotare un metodo con @Scheduled sono:

  • un metodo dovrebbe avere il tipo restituito void
  • un metodo non dovrebbe accettare alcun parametro

2. Abilitare il supporto per la pianificazione

Per abilitare il supporto per le attività di pianificazione e l' annotazione @Scheduled in primavera, possiamo utilizzare l'annotazione in stile abilitazione Java:

@Configuration @EnableScheduling public class SpringConfig { ... }

Al contrario, possiamo fare lo stesso in XML:

3. Pianificare un'attività con un ritardo fisso

Iniziamo configurando un'attività in modo che venga eseguita dopo un ritardo fisso:

@Scheduled(fixedDelay = 1000) public void scheduleFixedDelayTask() { System.out.println( "Fixed delay task - " + System.currentTimeMillis() / 1000); }

In questo caso, viene fissata la durata tra la fine dell'ultima esecuzione e l'inizio dell'esecuzione successiva. L'attività attende sempre fino al termine di quella precedente.

Questa opzione deve essere utilizzata quando è obbligatorio che la precedente esecuzione venga completata prima di eseguire di nuovo.

4. Pianificare un'attività a un tasso fisso

Eseguiamo ora un'attività a un intervallo di tempo fisso:

@Scheduled(fixedRate = 1000) public void scheduleFixedRateTask() { System.out.println( "Fixed rate task - " + System.currentTimeMillis() / 1000); }

Questa opzione dovrebbe essere utilizzata quando ogni esecuzione dell'attività è indipendente.

Tieni presente che le attività pianificate non vengono eseguite in parallelo per impostazione predefinita. Quindi, anche se abbiamo usato fixedRate , l'attività successiva non verrà richiamata fino a quando non verrà completata quella precedente.

Se vogliamo supportare il comportamento parallelo nelle attività pianificate, dobbiamo aggiungere l' annotazione @Async :

@EnableAsync public class ScheduledFixedRateExample { @Async @Scheduled(fixedRate = 1000) public void scheduleFixedRateTaskAsync() throws InterruptedException { System.out.println( "Fixed rate task async - " + System.currentTimeMillis() / 1000); Thread.sleep(2000); } }

Ora questa attività asincrona verrà richiamata ogni secondo, anche se l'attività precedente non viene eseguita.

5. Tasso fisso vs ritardo fisso

Possiamo eseguire un'attività pianificata utilizzando l' annotazione @Scheduled di Spring , ma in base alle proprietà fixedDelay e fixedRate, la natura dell'esecuzione cambia.

La proprietà fixedDelay assicura che ci sia un ritardo di n millisecondi tra l'ora di fine di un'esecuzione di un'attività e l'ora di inizio della successiva esecuzione dell'attività.

Questa proprietà è particolarmente utile quando dobbiamo assicurarci che solo un'istanza dell'attività venga eseguita per tutto il tempo. Per lavori dipendenti, è molto utile.

La proprietà fixedRate esegue l'attività pianificata ogni n millisecondi. Non controlla eventuali precedenti esecuzioni dell'attività.

Ciò è utile quando tutte le esecuzioni dell'attività sono indipendenti. Se non ci aspettiamo di superare la dimensione della memoria e del pool di thread, fixedRate dovrebbe essere abbastanza utile.

Anche se, se le attività in arrivo non finiscono rapidamente, è possibile che finiscano con l '"eccezione di memoria esaurita".

6. Pianificare un'attività con ritardo iniziale

Quindi, programmiamo un'attività con un ritardo (in millisecondi):

@Scheduled(fixedDelay = 1000, initialDelay = 1000) public void scheduleFixedRateWithInitialDelayTask() { long now = System.currentTimeMillis() / 1000; System.out.println( "Fixed rate task with one second initial delay - " + now); }

Nota come stiamo usando sia fixedDelay che initialDelay in questo esempio. L'attività verrà eseguita la prima volta dopo il valore initialDelay e continuerà a essere eseguita in base a fixedDelay .

Questa opzione è utile quando l'attività ha una configurazione che deve essere completata.

7. Pianificare un'attività utilizzando le espressioni Cron

A volte i ritardi e le tariffe non sono sufficienti e abbiamo bisogno della flessibilità di un'espressione cron per controllare la pianificazione delle nostre attività:

@Scheduled(cron = "0 15 10 15 * ?") public void scheduleTaskUsingCronExpression() { long now = System.currentTimeMillis() / 1000; System.out.println( "schedule tasks using cron jobs - " + now); }

Tieni presente che in questo esempio pianifichiamo un'attività da eseguire alle 10:15 il 15 ° giorno di ogni mese.

Per impostazione predefinita, Spring utilizzerà il fuso orario locale del server per l'espressione cron. Tuttavia, possiamo utilizzare l' attributo zone per modificare questo fuso orario :

@Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris")

Con questa configurazione, Spring programmerà l'esecuzione del metodo annotato alle 10:15 del 15 ° giorno di ogni mese nell'ora di Parigi.

8. Parametrizzazione della pianificazione

L'hardcoding di queste pianificazioni è semplice, ma in genere è necessario essere in grado di controllare la pianificazione senza ricompilare e ridistribuire l'intera app.

Faremo uso di Spring Expressions per esternare la configurazione delle attività e le memorizzeremo nei file delle proprietà.

Un'attività fixedDelay :

@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")

Un'attività fixedRate :

@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")

Un'attività basata su un'espressione cron :

@Scheduled(cron = "${cron.expression}")

9. Configurazione delle attività pianificate utilizzando XML

Spring fornisce anche un modo XML per configurare le attività pianificate. Ecco la configurazione XML per impostarli:

10. Conclusione

In questo articolo, abbiamo discusso il modo di configurare e utilizzare l' annotazione @Scheduled .

Abbiamo coperto il processo per abilitare la pianificazione e vari modi per configurare i modelli di attività di pianificazione.

Gli esempi mostrati sopra possono essere trovati su GitHub.