Un guide du planificateur de tâches Spring

1. Vue d'ensemble

Dans cet article, nous aborderons les mécanismes de planification de tâches Spring - TaskScheduler et ses implémentations pré-construites ainsi que les différents déclencheurs à utiliser. Si vous souhaitez en savoir plus sur la planification au printemps, consultez les articles @Async et @Scheduled .

TaskScheuler a été introduit dans Spring 3.0 avec une variété de méthodes à exécuter à un moment donné dans le futur, il retourne également un objet de représentation de l' interface ScheduledFuture , qui pourrait être utilisé pour annuler une tâche planifiée ou vérifier si c'est fait ou non.

Tout ce que nous devons faire est de sélectionner une tâche exécutable pour la planification, puis de sélectionner une politique de planification appropriée.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler est bien adapté à la gestion des threads internes, car il délègue des tâches au ScheduledExecutorService et implémente l' interface TaskExecutor - de sorte qu'une seule instance de celui-ci soit capable de gérer les exécutions potentielles asynchrones ainsi que l' annotation @Scheduled .

Définissons maintenant ThreadPoolTaskScheduler haricots à 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; } }

Le threadPoolTaskScheduler de bean configuré peut exécuter des tâches de manière asynchrone en fonction de la taille de pool configurée de 5.

Notez que tous les noms de thread liés à ThreadPoolTaskScheduler seront préfixés par ThreadPoolTaskScheduler .

Implémentons une tâche simple que nous pouvons ensuite planifier:

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()); } } 

Nous pouvons maintenant planifier simplement cette tâche à exécuter par le planificateur:

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

Le taskScheduler planifiera cette tâche exécutable à une date connue, exactement 3 secondes après l'heure actuelle.

Allons maintenant un peu plus en profondeur avec les mécanismes de planification ThreadPoolTaskScheduler .

3. Planifier une tâche exécutable avec un délai fixe

La planification avec un délai fixe peut être effectuée avec deux mécanismes simples:

3.1. Planification après un délai fixe de la dernière exécution programmée

Configurons une tâche pour qu'elle s'exécute après un délai fixe de 1000 millisecondes:

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

La RunnableTask s'exécutera toujours 1000 millisecondes plus tard entre la fin d'une exécution et le début de la suivante.

3.2. Planification après un délai fixe d'une date spécifique

Configurons une tâche pour qu'elle s'exécute après un délai fixe d'une heure de début donnée:

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

La RunnableTask sera appelée à l'heure d'exécution spécifiée, principalement l'heure à laquelle la méthode @PostConstruct démarre et ensuite avec un délai de 1000 millisecondes.

4. Planification à un taux fixe

Il existe deux mécanismes simples pour planifier des tâches exécutables à un taux fixe:

4.1. Planification de la tâche exécutable à un taux fixe

Planifions une tâche à exécuter à un taux fixe de millisecondes :

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

La prochaine RunnableTask s'exécutera toujours après 2000 millisecondes, quel que soit l'état de la dernière exécution qui peut être encore en cours.

4.2. Planification de la tâche exécutable à un taux fixe à partir d'une date donnée

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

La RunnableTask s'exécutera 3000 millisecondes après l'heure actuelle.

5. Planification avec CronTrigger

CronTrigger est utilisé pour planifier une tâche basée sur une expression cron:

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

Le déclencheur fourni peut être utilisé pour exécuter une tâche selon une certaine cadence ou un calendrier spécifié:

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

Dans ce cas, la RunnableTask sera exécutée à la 10e seconde de chaque minute.

6. Planification avec PeriodicTrigger

Utilisons PeriodicTrigger pour planifier une tâche avec un délai fixe de 2000 millisecondes:

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

Le bean PeriodicTrigger configuré serait utilisé pour exécuter une tâche après un délai fixe de 2000 millisecondes.

Planifions maintenant la RunnableTask avec PeriodicTrigger :

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

Nous pouvons également configurer PeriodicTrigger pour qu'il soit initialisé à un taux fixe plutôt qu'un délai fixe, nous pouvons également définir un délai initial pour la première tâche planifiée d'une milliseconde donnée.

Tout ce que nous devons faire est d'ajouter deux lignes de code avant l'instruction de retour au bean PeriodicTrigger :

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

Nous avons utilisé la méthode setFixedRate pour planifier la tâche à un taux fixe plutôt qu'avec un délai fixe, puis la méthode setInitialDelay est utilisée pour définir le délai initial uniquement pour la première tâche exécutable à exécuter.

7. Conclusion

Dans cet article rapide, nous avons illustré comment planifier une tâche exécutable à l'aide du support Spring pour les tâches.

Nous avons examiné l'exécution de la tâche avec un délai fixe, à un taux fixe et selon un déclencheur spécifié.

Et, comme toujours, le code est disponible en tant que projet Maven sur GitHub.