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