Automatiser des Tâches avec Spring Scheduling

Automatiser des Tâches avec Spring Scheduling
🕵️♂️ @By YACOUBA KONE 🎓
Spring Scheduling est un module de Spring Boot qui permet d'exécuter des tâches automatiques à des intervalles réguliers, sans nécessiter de gestion manuelle des threads.
👉 Cas d’usage concrets :
Exécuter un script chaque minute pour récupérer des données d’une API
Envoyer des emails automatiques tous les jours à 8h
Nettoyer une base de données chaque semaine
1️⃣ Ajouter Spring Scheduling à son projet
Spring Boot intègre déjà Spring Scheduling, mais il faut activer cette fonctionnalité.
1. Ajouter la dépendance (si nécessaire)
Dans pom.xml
(si elle n’est pas déjà installée) :
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
2. Activer le Scheduling dans Spring Boot
Dans la classe principale @SpringBootApplication
, ajoute cette annotation :
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling // Active le scheduling public class SchedulingApplication { public static void main(String[] args) { SpringApplication.run(SchedulingApplication.class, args); } }
✨ Maintenant, Spring peut exécuter des tâches en arrière-plan.
2️ Exemple 1 : Exécuter une tâche toutes les 10 secondes
Créons un service qui affiche un message dans la console toutes les 10 secondes.
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.LocalTime; @Service public class ScheduledTaskService { @Scheduled(fixedRate = 10000) // Exécute la tâche toutes les 10 secondes public void executeTask() { System.out.println("📌 Tâche exécutée à : " + LocalTime.now()); } }
🔹 Explication :
@Scheduled(fixedRate = 10000)
: La tâche s'exécute toutes les 10 secondes, quelle que soit sa durée.LocalTime.now()
: Affiche l’heure d’exécution.
✨ Résultat :
Dans la console, toutes les 10 secondes :
📌 Tâche exécutée à : 12:00:10
📌 Tâche exécutée à : 12:00:20
📌 Tâche exécutée à : 12:00:30
3️ Exemple 2 : Planifier une tâche à heure fixe avec Cron
Tu veux exécuter une tâche tous les jours à 8h du matin ? 📆
Utilisons une expression CRON !
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.LocalTime; @Service public class CronJobService { @Scheduled(cron = "0 0 8 * * *") // Tous les jours à 08:00 public void dailyTask() { System.out.println("🌅 Tâche exécutée à 8h : " + LocalTime.now()); } }
🔹 Explication de cron = "0 0 8 * * *"
:
- 0 → Seconde (exécute au début de la minute)
- 0 → Minute (exécute au début de l’heure)
- 8 → Heure (8h du matin)
- * → Tous les jours, tous les mois, toutes les semaines
✨Résultat attendu :
La tâche s’exécute chaque jour à 08:00.
4️ Exemple 3 : Nettoyer une base de données tous les lundis matin
Tu veux supprimer les anciens logs tous les lundis à 2h du matin ?
1. Ajouter un Repository pour gérer les logs
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface LogRepository extends JpaRepository<Log, Long> { List<Log> findByCreatedAtBefore(LocalDateTime date); void deleteByCreatedAtBefore(LocalDateTime date); }
2. Créer le service qui supprime les logs
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @Service public class LogCleanupService { private final LogRepository logRepository; public LogCleanupService(LogRepository logRepository) { this.logRepository = logRepository; } @Scheduled(cron = "0 0 2 * * 1") // Tous les lundis à 2h du matin public void cleanOldLogs() { LocalDateTime oneMonthAgo = LocalDateTime.now().minusMonths(1); logRepository.deleteByCreatedAtBefore(oneMonthAgo); System.out.println("🗑️ Logs supprimés avant : " + oneMonthAgo); } }
🔹 Explication :
cron = "0 0 2 * * 1"
→ Exécute chaque lundi à 02:00.LocalDateTime.now().minusMonths(1)
→ Récupère les logs de plus d’un mois.logRepository.deleteByCreatedAtBefore(oneMonthAgo)
→ Supprime les anciens logs.
✨ Résultat attendu :
Chaque lundi à 2h du matin, les logs vieux de plus d’un mois sont supprimés.
5️ Exemple 4 : Envoyer un email automatique tous les jours
1. Ajouter la dépendance pour l’envoi d’email
Ajoute cette dépendance dans pom.xml
:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
2. Configurer SMTP dans application.properties
spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username=tonemail@gmail.com spring.mail.password=tonmotdepasse spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true
3. Service d’envoi d’emails
import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; @Service public class EmailSchedulerService { private final JavaMailSender mailSender; public EmailSchedulerService(JavaMailSender mailSender) { this.mailSender = mailSender; } @Scheduled(cron = "0 0 9 * * *") // Envoi d'email tous les jours à 9h public void sendDailyEmail() throws MessagingException { MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setTo("client@email.com"); helper.setSubject("📩 Rapport quotidien"); helper.setText("Bonjour, voici votre rapport du jour !", true); mailSender.send(message); System.out.println("📬 Email envoyé à 9h !"); } }
✨ Résultat attendu :
Un email est envoyé chaque jour à 9h à client@email.com
.
🚀 Conclusion
On a vu comment Spring Scheduling permet d’exécuter des tâches automatiques :
✨ Exécuter une tâche toutes les 10 secondes
✨ Planifier une tâche chaque jour à 8h avec CRON
✨ Nettoyer une base de données tous les lundis à 2h
✨ Envoyer un email automatique chaque matin