L’annotation @Scheduled in Spring

L'annotation @Scheduled in Spring

1. Vue d'ensemble

Dans cet article, nous aborderonsthe Spring @Scheduled annotation - nous illustrerons comment il peut être utilisé pour configurer et planifier des tâches.

Les règles simples à suivre pour annoter une méthode avec@Scheduled sont:

  • une méthode doit avoir un type de retour nul

  • une méthode ne doit accepter aucun paramètre

Lectures complémentaires:

Comment faire @Async au printemps

Comment activer et utiliser @Async dans Spring - de la configuration très simple et de l’utilisation de base aux exécuteurs les plus complexes et aux stratégies de gestion des exceptions.

Read more

Guide du planificateur de tâches de printemps

Un guide rapide et pratique sur la planification au printemps avec le planificateur de tâches

Read more

Planification au printemps avec Quartz

Introduction rapide au travail avec Quartz au printemps.

Read more

2. Activer la prise en charge de la planification

Pour activer la prise en charge de la planification des tâches et de l'annotation@Scheduled dans Spring, nous pouvons utiliser l'annotation de style d'activation Java:

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

Ou nous pouvons faire la même chose en XML:

3. Planifier une tâche à délai fixe

Commençons par configurer une tâche à exécuter après un délai fixe:

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

Dans ce cas, la durée entre la fin de la dernière exécution et le début de la prochaine exécution est fixée. La tâche attend toujours que la précédente soit terminée.

Cette option doit être utilisée lorsqu'il est impératif que l'exécution précédente soit terminée avant de pouvoir être exécutée à nouveau.

4. Planifier une tâche à un taux fixe

Exécutons maintenant une tâche à un intervalle de temps fixe:

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

Cette option doit être utilisée lorsque chaque exécution de la tâche est indépendante.

Notez que les tâches planifiées ne s'exécutent pas en parallèle par défaut. Ainsi, même si nous avons utiliséfixedRate, la tâche suivante ne sera invoquée que lorsque la précédente sera terminée.

Si nous voulons prendre en charge le comportement parallèle dans les tâches planifiées, nous devons ajouter l'annotation@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);
    }

}

Désormais, cette tâche asynchrone sera appelée chaque seconde, même si la tâche précédente n’est pas terminée.

5. Taux fixe vs délai fixe

Nous pouvons exécuter une tâche planifiée à l’aide de l’annotation@Scheduled de Spring, mais en fonction des propriétésfixedDelay etfixedRate, la nature des changements d’exécution.

La propriétéfixedDelay garantit qu'il y a un délai den milliseconde entre l'heure de fin d'une exécution d'une tâche et l'heure de début de la prochaine exécution de la tâche.

Cette propriété est particulièrement utile lorsque nous devons nous assurer que seule une instance de la tâche est exécutée à tout moment. Pour les emplois dépendants, c'est très utile.

The fixedRate property runs the scheduled task at every n millisecond. Il ne vérifie aucune exécution précédente de la tâche.

Ceci est utile lorsque toutes les exécutions de la tâche sont indépendantes. Si nous ne prévoyons pas dépasser la taille de la mémoire et du pool de threads,fixedRate devrait être assez pratique.

Mais si les tâches entrantes ne se terminent pas rapidement, il est possible qu’elles se retrouvent avec une «exception de mémoire insuffisante».

6. Planifier une tâche avec un délai initial

Ensuite, planifions une tâche avec un délai (en millisecondes):

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

Notez comment nous utilisons à la foisfixedDelay etinitialDelay dans cet exemple. La tâche sera exécutée une première fois après la valeurinitialDelay - et elle continuera à être exécutée selon lesfixedDelay.

Cette option est utile lorsque la tâche a une configuration à compléter.

7. Planifier une tâche à l'aide d'expressions Cron

Parfois, les retards et les tarifs ne suffisent pas, et nous avons besoin de la souplesse d'une expression cron pour contrôler le calendrier de nos tâches:

@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {

    long now = System.currentTimeMillis() / 1000;
    System.out.println(
      "schedule tasks using cron jobs - " + now);
}

Remarque - dans cet exemple, nous planifions une tâche à exécuter à 10 h 15 le 15 de chaque mois.

8. Paramétrage de l'horaire

Le codage en dur de ces planifications est simple, mais en règle générale, vous devez être en mesure de contrôler la planification sans recompiler ni redéployer l'ensemble de l'application.

Nous utiliserons Spring Expressions pour externaliser la configuration des tâches - et nous les stockerons dans des fichiers de propriétés:

Une tâchefixedDelay:

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

Une tâchefixedRate:

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

Une tâche basée sur une expressioncron:

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

9. Configuration des tâches planifiées à l'aide de XML

Spring fournit également un moyen XML pour configurer les tâches planifiées - voici la configuration XML pour les configurer:






    
    
    

10. Conclusion

Dans cet article, nous avons compris le chemin versconfigure and use the @Scheduled annotation.

Nous avons couvert le processus pour permettre la planification et diverses manières de configurer les modèles de tâches de planification.

Les exemples montrés peuvent être trouvésover on GitHub.