Maison >Java >javaDidacticiel >Comment puis-je planifier dynamiquement des tâches au printemps sans redéployer ?

Comment puis-je planifier dynamiquement des tâches au printemps sans redéployer ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-29 10:59:10212parcourir

How Can I Dynamically Schedule Jobs in Spring Without Redeploying?

Planification dynamique des tâches au printemps

Contexte :

La bibliothèque Spring Scheduling simplifie le processus de planifier des tâches à intervalles réguliers à l'aide d'annotations (@Scheduled). Cependant, il devient parfois nécessaire d’ajuster dynamiquement l’heure planifiée sans redéployer l’application. Ceci peut être réalisé à l'aide du mécanisme Trigger.

Utiliser un Trigger :

Un Trigger vous permet de calculer à la volée la prochaine heure d'exécution d'une tâche planifiée. Cette approche contourne les limitations liées à l'utilisation d'annotations pour la planification dynamique. Voici comment vous pouvez l'implémenter :

Exemple :

Dans cet exemple, un déclencheur personnalisé est créé pour déterminer dynamiquement la prochaine heure d'exécution en fonction d'une valeur de propriété obtenue à partir de l'environnement.

@Configuration
@EnableScheduling
public class MyAppConfig implements SchedulingConfigurer {

    @Autowired
    Environment env;

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean(destroyMethod = "shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(
                new Runnable() {
                    @Override public void run() {
                        myBean().getSchedule();
                    }
                },
                new Trigger() {
                    @Override public Date nextExecutionTime(TriggerContext triggerContext) {
                        Calendar nextExecutionTime = new GregorianCalendar();
                        Date lastActualExecutionTime = triggerContext.lastActualExecutionTime();
                        nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
                        nextExecutionTime.add(Calendar.MILLISECOND, env.getProperty("myRate", Integer.class)); // Obtain value programmatically
                        return nextExecutionTime.getTime();
                    }
                }
        );
    }
}

Dans cette configuration :

  • Le bean Environment est utilisé pour récupérer le propriété dynamique myRate.
  • Un déclencheur est défini pour calculer la prochaine heure d'exécution en fonction de la valeur de la propriété récupérée.
  • Le ScheduledTaskRegistrar est utilisé pour enregistrer la tâche planifiée avec le déclencheur dynamique.

En utilisant un déclencheur, vous pouvez ajuster dynamiquement l'heure planifiée en fonction de toute logique ou valeur disponible au moment de l'exécution, offrant ainsi flexibilité et contrôle sur la tâche. planification.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn