Découvrez comment utiliser ShedLock pour éviter l'exécution concurrente des tâches planifiées dans une architecture Spring Boot multi-instances. Guide complet avec configuration, bonnes pratiques et exemple de code.
Pour les applications d'entreprise, en 2025 l’exécution de tâches planifiées est un besoin courant : génération de rapports, traitements par lots, synchronisation de données, etc.
Avec Spring Boot il suffit d’annoter une opération avec @Scheduled
pour déclencher des traitements à heure fixe ou à intervalles réguliers.
Cependant l'adoption croissante des architectures distribuées et le déploiement d'applications multi-instances pour la haute disponibilité fait émerger un nouveau défi : comment éviter l'exécution simultanée d'une même tâche planifiée sur toutes les instances ?
Imaginons un scénario où votre application, déployée sur trois instances, doit générer un rapport quotidien. Sans mécanisme de synchronisation, chaque instance va tenter d'exécuter la tâche, conduisant à :
ShedLock, développé par Lukáš Křečan, apporte une solution à ce problème. Son principe est simple mais efficace : utiliser un verrou centralisé pour s'assurer qu'une seule instance exécute la tâche planifiée à un moment donné.
L'architecture de ShedLock s'articule autour de quelques composants clés :
Voici
un exemple complet de configuration de ShedLock. Ici on choisit de stocker les verrous dans la base de donnée car elle est partagée entre toutes les instances de l’application. On choisit donc l’implémentation JdbcTemplateLockProvider de LockProvider
💡 Astuce : vous pouvez mettre l’annotation @SchedulerLock
sur n’importe quelle méthode, même si elle n’est pas annotée @Scheduled
. Ainsi vous pouvez par exemple bloquer seulement une partie d’un traitement planifié.Est-ce une bonne idée ? C’est une autre histoire.
Pour les tests d'intégration, l'utilisation de TestContainers permet de reproduire un environnement proche de la production :
Comme nous l'avons découvert lors de nos tests, le Registry de ShedLock peut créer des situations inattendues. Voici les points importants à retenir :
lockProvider.clearCache()
Pour une supervision efficace, surveillez :
ShedLock résout élégamment le problème des tâches planifiées en environnement distribué. Sa mise en place est simple, mais requiert une attention particulière aux détails de configuration et aux pièges potentiels, notamment au niveau du cache Registry.
Son intégration avec Spring Boot et sa flexibilité en termes de stockage (base de données, Redis, MongoDB, etc.) en font un choix pertinent pour sécuriser vos traitements planifiés en architecture multi-instances.
N'oubliez pas de consulter la documentation officielle de ShedLock pour les dernières mises à jour et options de configuration.