Tâches planifiées à horaire fixe
En utilisant le framework Spring, l'annotation @Scheduled permet de définir des tâches à exécuter à des moments précis. Par exemple, pour planifier une exécution quotidienne à 8h30 et 18h30, le code suivant peut être employé :
@Scheduled(cron = "0 30 8,18 * * ?")
Dans une expression cron, les positions correspondent aux champs suivants :
- Premier : secondes (0-59)
- Deuxième : minutes (0-59)
- Troisième : heures (0-23)
- Quatrième : jour du mois (1-31)
- Cinquième : mois (1-12)
- Sixième : jour de la semaine (0-7, où 0 et 7 représentent dimanche)
- Septième : année (optionnel, vide pour toute année)
Cette approche est idéale pour les tâches dont le calendrier est prédéterminé.
Tâches planifiées à horaire variable
Pour des tâches devant s'exécuter à un moment spécifique mais changeant, une mise en place avec ScheduledExecutorService est nécessaire. Voici un exemple où une tâche est calculée pour une heure cible, avec ajustement si l'heure est déjà passée :
// Création d'un pool de threads pour les tâches planifiées
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
// Calcul du délai jusqu'à l'heure cible, par exemple 15h45
Calendar calendrier = Calendar.getInstance();
calendrier.set(Calendar.HOUR_OF_DAY, 15);
calendrier.set(Calendar.MINUTE, 45);
calendrier.set(Calendar.SECOND, 0);
Date heureCible = calendrier.getTime();
long delai = heureCible.getTime() - System.currentTimeMillis();
// Si l'heure cible est déjà passée, reporter à demain
if (delai < 0) {
delai += 24 * 60 * 60 * 1000;
}
// Définition de la tâche à exécuter
Runnable tâcheExécution = () -> {
// Logique de la tâche ici
};
// Planification de la tâche après le délai calculé
ScheduledFuture> futureTâche = executorService.schedule(tâcheExécution, delai, TimeUnit.MILLISECONDS);
// Fermeture du pool de threads (à faire après utilisation)
executorService.shutdownNow();
L'unité de temps TimeUnit.MILLISECONDS peut être adaptée selon les besoins, avec des options telles que TimeUnit.SECONDS, TimeUnit.MINUTES, etc.
Pour une exécution répétée à intervalles fixes, la méthode scheduleAtFixedRate est utile. L'exemple ci-dessous planifie une tâche qui s'exécute toutes les 24 heures après l'exécution initiale :
executorService.scheduleAtFixedRate(tâcheExécution, delai, 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS);
Pour annuler une tâche en cours, utilisez :
futureTâche.cancel(true);
Le paramètre true tente d'interrompre l'exécution si la tâche a déjà commencé, tandis que false annule seulement si elle n'a pas encore démarré.