Maison  >  Article  >  Java  >  Comment modifier dynamiquement Scheduled dans SpringBoot

Comment modifier dynamiquement Scheduled dans SpringBoot

WBOY
WBOYavant
2023-05-15 20:58:151788parcourir

SpringBoot modifie dynamiquement Scheduled

Scénario :

Temps d'exécution planifié configurable, le planning normal est fixé au démarrage du projet, il n'y a aucun moyen de mettre à jour automatiquement le temps d'exécution planifié en fonction de l'appel du code d'arrière-plan

Par exemple :

Système démarrage Heure de lecture Cron : 0 0 3 * *?, vous pouvez configurer dynamiquement le format de l'heure Cron en exécutant la méthode en arrière-plan, effacer la tâche d'exécution d'origine et exécuter la nouvelle heure de tâche planifiée définie

1. aux classes ThreadPoolTaskScheduler et ScheduledFuture (la classe ThreadPoolTaskScheduler ne peut pas utiliser @Autowired et définir directement les variables membres)

private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;

2 Modifier dynamiquement la logique de la méthode d'arrière-plan Scheduled (l'objet est la logique de synchronisation que la classe d'implémentation Runnable doit exécuter, et mettez-le dans la méthode du thread d'exécution)

threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
if(future!=null){
    future.cancel(true);
}
future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron时间格式字符串") );

La logique ci-dessus ----------------------- Vous pouvez implémenter une configuration planifiée dynamique

ce qui suit logique------------------- -------- Configurez le projet pour qu'il démarre automatiquement la lecture de DB Cron, définissez le timing

1, @Order et implémentez la réécriture de la classe CommandLineRunner méthode run

@Override
    public void run(String... args) throws Exception {
        logger.info("系统启动 默认设置对账任务 时间");
        //获取目前DB 设置的对账时间
        GetBillTimeResp time = systemConfigService.getTime();
        //获取Cron时间格式字符串
        String timeCron = billTimeCronFormat(time.getBillTime());
        logger.info("时间为:"+timeCron);
        //Scheduler 设置每天执行。。。
        threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.initialize();
        future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }

Projet SpringBoot @Scheduled pour lire les paramètres dynamiques

1, basé sur @ Développement configurable planifié

application.propertites: 
read.timer.parmas=0 0/1 * * * *

Classe de synchronisation :

@Component
public class ScheduledService {
Logger logger= LoggerFactory.getLogger(ScheduledService.class);
    @Scheduled(cron = "${read.timer.parmas}")
    public void readConfigTable(){
        logger.info("*****.read.timer.parmas");
    }
}

Classe de démarrage :

@SpringBootApplication
@EnableScheduling  //必须
public class DataApplication {
  public static void main(String[] args) {
        SpringApplication.run(DataApplication.class,args);
    }
}

2 Implémentation basée sur le code

(1) Core. code

@Component
@EnableScheduling
public class TestScheduledParams implements SchedulingConfigurer{
    Logger logger= LoggerFactory.getLogger(TestScheduledParams.class);
 
    public static  String DEFAULT_CORN="0/3 * * * * *";
    //##动态传参要给默认值。
    public static String corn=DEFAULT_CORN;
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {     
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
               // logger.info("定时任务逻辑");
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //任务触发,可修改任务的执行周期
                CronTrigger cronTrigger = new CronTrigger(corn);
                Date date = cronTrigger.nextExecutionTime(triggerContext);
                return date;
            }
        });
    }
}

(2) Autres classes ou méthodes de paramétrage dynamique

TestScheduledParams.corn="0/20 * * * * *"

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer