Вы можете использовать Trigger
, который позволяет динамически контролировать следующее выполнение. Вы должны реализовать SchedulingConfigurer
, другой ответ охватывает именно это:
Scheduling a job with Spring programmatically (with fixedRate set dynamically)
EDIT, чтобы ответить на комментарии:
nextExecutionTime
называется и дальше и дальше ... В следующий раз, когда задачи (и nextExecutionTime) называются определяется следующим образом:
nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
nextExecutionTime.add(Calendar.MILLISECOND, numberOfMillisecondsBeforeCallingTheTask);
Все, что вам нужно сделать, это иметь это numberOfMillisecondsBeforeCallingTheTask
значение чанга редактор
Пример:
@RestController
public class MyController {
public static int triggerDelay = 1000;
@RequestMapping("/changetrigger/{val}")
public void test(@PathVariable int val){
this.triggerDelay = val;
}
}
@SpringBootApplication
@EnableScheduling
public class Launcher implements SchedulingConfigurer{
public static void main(String[] args){
new SpringApplicationBuilder() //
.sources(Launcher.class)//
.run(args);
}
@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
;
taskRegistrar.addTriggerTask(new TriggerTask(new Runnable() {
@Override
public void run() {
System.out.println("blah");
System.out.println(System.currentTimeMillis());
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
Calendar nextExecutionTime = new GregorianCalendar();
nextExecutionTime.setTime(new Date());
nextExecutionTime.add(Calendar.MILLISECOND, MyController.triggerDelay);
System.out.println(System.currentTimeMillis());
return nextExecutionTime.getTime();
}}));
}
}
Обратите внимание, как динамическое значение MyController.triggerDelay
используется для следующего выполнения. Поэтому, если вы измените номер, будет изменено следующее время выполнения. Вы увидите, поставили ли вы точку останова внутри nextExecutionTime
.
Выглядит хорошо, но работает только при запуске приложения, не так ли? Мне нужно постоянно запускать и останавливать запланированные задачи. –
обновил ответ, чтобы объяснить, почему он динамичен. – alexbt
Я нашел решение благодаря вам, но это немного другое. вероятно, больше подходит для моих нужд. Я проголосовал, и я добавлю свое собственное решение, чтобы получить некоторые отзывы об этом. Благодаря! –