Guide du planificateur de tâches de printemps

Guide du planificateur de tâches de printemps

1. Vue d'ensemble

Dans cet article, nous aborderons lesSpring task scheduling mechanisms -TaskScheduler et ses implémentations prédéfinies ainsi que les différents déclencheurs à utiliser. Si vous voulez 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 renvoie également un objet de représentation de l'interfaceScheduledFuture, qui pourrait être utilisé pour annuler la tâche planifiée ou vérifier si elle fait ou pas.

Tout ce que nous avons à faire est de sélectionner une tâche exécutable pour la planification, puis de choisir une stratégie de planification appropriée.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler ** est bien adapté à la gestion des threads internes, car il délègue des tâches auxScheduledExecutorService et implémente l'interfaceTaskExecutor - 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 le beanThreadPoolTaskScheduler àThreadPoolTaskSchedulerConfig: __

@Configuration
@ComponentScan(
  basePackages="org.example.taskscheduler",
  basePackageClasses={ThreadPoolTaskSchedulerExamples.class})
public class ThreadPoolTaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler threadPoolTaskScheduler
          = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix(
          "ThreadPoolTaskScheduler");
        return threadPoolTaskScheduler;
    }
}

Le beanthreadPoolTaskScheduler 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 threads associés àThreadPoolTaskScheduler seront précédés deThreadPoolTaskScheduler.

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 pour qu'elle soit exécutée par le planificateur:

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

LetaskScheduler 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 deThreadPoolTaskScheduler.

3. Planifier la tâcheRunnable avec 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 planifiée

Configurons une tâche à exécuter après un délai fixe de 1000 millisecondes:

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

LesRunnableTask s'exécuteront 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);

LesRunnableTask seront appelés à l'heure d'exécution spécifiée, qui est principalement l'heure à laquelle la méthode@PostConstruct démarre et ensuite avec un délai de ** 1000 millisecondes.

4. Planification à taux fixe

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

4.1. Planification desRunnableTask à un taux fixe

Planifions une tâche à exécuter à unfixed rate of milliseconds:

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

LesRunnableTask suivants s'exécuteront 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 desRunnableTask à un taux fixe à partir d'une date donnée

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

LesRunnableTask s'exécuteront 3000 millisecondes après l'heure actuelle.

5. Planification avecCronTrigger

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 cadence ou un calendrier spécifié:

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

Dans ce cas, lesRunnableTask seront exécutés à la 10e seconde de chaque minute.

6. Planification avecPeriodicTrigger

UtilisonsPeriodicTrigger pour planifier une tâche avec unfixed delay de 2000 millisecondes:

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

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

Planifions maintenant lesRunnableTask avec lesPeriodicTrigger:

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

Nous pouvons également configurerPeriodicTrigger pour être 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 beanperiodicTrigger:

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

Nous avons utilisé la méthodesetFixedRate pour planifier la tâche à un taux fixe plutôt qu'avec un délai fixe, puis la méthodesetInitialDelay 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 de la prise en charge de 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 Mavenover in GitHub.