Partage de technologie

SpringBoot quotidiennement : l'implémentation @Scheduled est exécutée une fois au démarrage du service

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


En parlant de tâches planifiées, nous devrions penser à @Scheduled, Quartz et XXL-JOB. Cependant, certains services uniques ou petits projets peuvent utiliser directement @Scheduled pour implémenter des tâches asynchrones pour plus de commodité et de rapidité. Par conséquent, les exigences thématiques de cet article sont étendues.

Lorsque @Scheduled est utilisé dans un projet, comment la tâche asynchrone spécifiée peut-elle être exécutée à l'avance au démarrage du projet ?

1. Explication détaillée de @Scheduled

L'annotation @Scheduled prend en charge plusieurs paramètres pour contrôler de manière flexible le temps d'exécution des tâches.

  • cron : expression Cron, qui peut contrôler avec précision les secondes, les minutes, les heures, les jours, les mois, les semaines, etc.
    Insérer la description de l'image ici
  • fuseau : recevez un fuseau horaire, tel que Asie/Shanghai, le fuseau horaire que nous utilisons généralement. Nous laissons généralement ce champ vide.
  • fixDelay : combien de temps après l'heure de fin de la dernière exécution, il sera à nouveau exécuté. Tel que @Scheduled (fixedDelay = 5000)
  • fixDelayString : a la même signification quefixedDelay, mais sous la forme d'une chaîne. La seule différence est qu'il prend en charge les espaces réservés, tels que @Scheduled(fixedDelayString = "5000")
  • fixedRate : combien de temps après le dernier début de l'heure d'exécution, par exemple @Scheduled (fixedRate = 5000)
  • fixedRateString : a la même signification que fixedRate, mais sous la forme d'une chaîne. La seule différence est que les espaces réservés sont pris en charge.
  • initialDelay : combien de temps retarder l'exécution pour la première fois. Par exemple, il sera exécuté après le premier délai de 1 seconde. Ensuite, il sera exécuté toutes les 5 secondes selon la règle fixedRate @Scheduled(initialDelay=1000, fixedRate=. 5000)
  • initialDelayString : a la même signification que initialDelayString, mais sous la forme d'une chaîne. La seule différence est que les espaces réservés sont pris en charge.

2. Implémentation logique

1. Créez une méthode logique de tâche planifiée

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Créez une nouvelle classe d'exécution de démarrage

Cette classe appelle principalement la méthode de tâche spécifiée manuellement au démarrage

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Remarque : Pensez à ajouter @EnableScheduling à la classe de démarrage pour que la tâche planifiée soit exécutée. Bien entendu, cela n'affecte pas le test logique de cet article.

3. Résultats des tests

Une fois le service démarré, affichez les informations d'impression
Insérer la description de l'image ici