Automatiser des Tâches avec Spring Scheduling

+5 min de lecture
Automatiser des Tâches avec Spring Scheduling
Y
Par YACOUBA KONE

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

Automatiser des TâchesSpring SchedulingSpring bootJavaJava MailCRON