Guide de ShedLock avec Spring

Guide de ShedLock avec le printemps

1. Vue d'ensemble

Spring fournit une API facile à implémenter pour la planification des travaux. Cela fonctionne très bien jusqu'à ce que nous déployions plusieurs instances de notre application. Spring par défaut ne peut pas gérer la synchronisation du planificateur sur plusieurs instances et exécute les travaux simultanément sur chaque nœud.

Dans ce court didacticiel, nous examinerons ShedLock - une bibliothèque Java qui garantit que nos tâches planifiées ne s'exécutent qu'une seule fois à la foisand is an alternative to Quartz.

2. Dépendances Maven

Pour utiliser ShedLock avec Spring, nous devons ajouter the shedlock-spring dependency:


    net.javacrumbs.shedlock
    shedlock-spring
    2.2.0

3. Configuration

Note that ShedLock works only in environments with a shared database. Il crée une table ou un document dans la base de données où il stocke les informations sur les verrous actuels.

Actuellement, ShedLock prend en charge Mongo, Redis, Hazelcast, ZooKeeper et n’importe quel logiciel doté d’un pilote JDBC.

Pour cet exemple,we’ll use a PostgreSQL database. Pour que cela fonctionne, nous devons fournirShedLock’s JDBC dependency:


    net.javacrumbs.shedlock
    shedlock-provider-jdbc-template
    2.1.0

Ensuite, nous devons créer une table de base de données pour que ShedLock conserve les informations sur les verrous du planificateur:

CREATE TABLE shedlock(
  name VARCHAR(64),
  lock_until TIMESTAMP(3) NULL,
  locked_at TIMESTAMP(3) NULL,
  locked_by  VARCHAR(255),
  PRIMARY KEY (name)
)

Une autre exigence de configuration que nous devons fournir sont les annotations@EnableScheduling et@EnableSchedulerLock sur notre classe de configuration Spring:

@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringApplication.class, args);
    }
}

Le paramètredefaultLockAtMostFor spécifie la durée par défaut pendant laquelle le verrou doit être conservé au cas où le nœud en cours d'exécution meurt. Il utilise le formatISO8601 Duration.

Dans la section suivante, nous verrons comment remplacer cette valeur par défaut.

4. Création de tâches

Pour créer une tâche planifiée gérée par ShedLock, nous plaçons simplement les annotations@Scheduled et@SchedulerLock sur une méthode:

@Component
class TaskScheduler {

    @Scheduled(cron = "*/15 * * * *")
    @SchedulerLock(name = "TaskScheduler_scheduledTask",
      lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
    public void scheduledTask() {
        // ...
    }
}

Examinons tout d'abord@Scheduled. Il prend en chargethe cron format, avec cette expression signifiant «toutes les 15 minutes».

Ensuite, en regardant@SchedulerLock,, le paramètrename doit être unique etClassName_methodName est généralement suffisant pour y parvenir. Nous ne voulons pas que plusieurs exécutions de cette méthode se produisent en même temps, et ShedLock utilise le nom unique pour y parvenir.

Nous avons également ajouté quelques paramètres facultatifs.

Tout d'abord, nous avons ajoutélockAtLeastForString afin de pouvoir mettre une certaine distance entre les appels de méthode. L'utilisation de“PT5M” ignifie que cette méthode maintiendra le verrou pendant 5 minutes au minimum. En d'autres termes,that means that this method can be run by ShedLock no more often than every five minutes.

Ensuite, nous avons ajoutélockAtMostForString pour spécifier combien de temps le verrou doit être conservé au cas où le nœud en cours d'exécution meurt. L'utilisation de“PT14M” ignifie qu'elle ne sera pas verrouillée pendant plus de 14 minutes.

Dans des situations normales, ShedLock libère le verrou directement à la fin de la tâche. Maintenant, vraiment, nous n'avons pas eu à faire cela parce quethere is a default provided in*@EnableSchedulerLock*,, mais nous avons choisi de remplacer cela ici.

5. Conclusion

Dans cet article, nous avons appris à créer et à synchroniser des tâches planifiées à l'aide de ShedLock.

Comme toujours, tout le code source est disponibleover on GitHub.