Guide de ShedLock avec Spring

1. Vue d'ensemble

Spring fournit une API facile à mettre en œuvre pour la planification des tâches. 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 - il exécute les travaux simultanément sur chaque nœud à la place.

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

2. Dépendances de Maven

Pour utiliser ShedLock avec Spring, nous devons ajouterla dépendance shedlock-spring :

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. Configuration

Notez que ShedLock fonctionne uniquement dans les environnements avec une base de données partagée en déclarant un LockProvider approprié . 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 tout ce qui a un pilote JDBC.

Pour cet exemple, nous utiliserons une base de données H2 en mémoire. Pour que cela fonctionne, nous devons fournir la base de données H2 et la dépendance JDBC de ShedLock:

 net.javacrumbs.shedlock shedlock-provider-jdbc-template 2.1.0   com.h2database h2 1.4.200 

Ensuite, nous devons créer une table de base de données pour ShedLock afin de conserver 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) )

Nous devons déclarer la source de données dans le fichier de propriétés de notre application Spring Boot afin que le bean DataSource puisse être câblé automatiquement . Dans cet exemple, nous utilisons l' application.yml pour définir la source de données de la base de données H2:

spring: datasource: driverClassName: org.h2.Driver url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: 

Configurons le LockProvider avec la configuration de source de données ci-dessus. Le printemps peut le rendre assez simple:

@Configuration public class SchedulerConfiguration { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider(dataSource); } }

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 Application { public static void main(String[] args) { SpringApplication.run(SpringApplication.class, args); } }

Le paramètre defaultLockAtMostFor 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 format de durée ISO8601.

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 BaeldungTaskScheduler { @Scheduled(cron = "0 0/15 * * * ?") @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") public void scheduledTask() { // ... } }

Tout d'abord, regardons @Scheduled . Il prend en charge le format cron , avec cette expression signifiant «toutes les 15 minutes».

Ensuite, jetez un œil à @SchedulerLock, le paramètre de nom doit être unique, et ClassName_methodName est généralement suffisant pour y parvenir. Nous ne voulons pas que plus d'une exécution de cette méthode se produise 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» signifie que cette méthode maintiendra le verrou pendant 5 minutes au minimum. En d'autres termes, cela signifie que cette méthode ne peut être exécutée par ShedLock que toutes les cinq 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» signifie qu'il sera verrouillé pendant 14 minutes maximum.

Dans des situations normales, ShedLock libère le verrou directement après la fin de la tâche. Maintenant, nous n'avons pas eu à le faire car il existe une valeur par défaut fournie dans @EnableSchedulerLock , mais nous avons choisi de la remplacer 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 disponible sur sur GitHub.