Я пришел с рабочим примером, так как я нашел ваш вопрос интересным и ранее интересовался этой проблемой.Он полностью основан на исходном коде, поэтому я понятия не имею, приближается ли он к наилучшей практике.Тем не менее, вы можете настроить его под свои нужды.К вашему сведению, вам не обязательно создавать новый объект ScheduledTaskRegistrar - я подумал, что, поскольку ваша цель - это динамический планировщик, вам не будет интересно определять свои задачи исключительно перезаписанным методом.
@SpringBootApplication
public class TaskScheduler implements SchedulingConfigurer, CommandLineRunner {
public static void main(String[] args){SpringApplication.run(TaskScheduler.class, args);}
List<CronTask> cronTasks;
@Override
public void run(String... args) throws Exception {
CronTask task = this.createCronTask(new Runnable() {
@Override
public void run() {
System.out.println(LocalDateTime.now());
}
}, "1/10 * * * * *");
ScheduledTaskRegistrar taskRegistrar = new ScheduledTaskRegistrar();
taskRegistrar.addCronTask(task);
configureTasks(taskRegistrar);
Thread.sleep(51);
taskRegistrar.destroy();
taskRegistrar = null;
ScheduledTaskRegistrar taskRegistrar2 = new ScheduledTaskRegistrar();
taskRegistrar2.addCronTask(task);
configureTasks(taskRegistrar2);
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// "Calls scheduleTasks() at bean construction time" - docs
taskRegistrar.afterPropertiesSet();
}
public CronTask createCronTask(Runnable action, String expression) {
return new CronTask(action, new CronTrigger(expression));
}
}
У меня есть опыт использования заданий cron в Azure и других местах.Программируя на Java, я обычно использовал @Scheduled
с фиксированным временем просто для простоты.Надеюсь, что это полезно для вас.