Я изучаю, как изменить частоту задания во время выполнения с помощью Java 8 и spring. Этот вопрос был очень полезен, но он не полностью решил мою проблему.
Теперь я могу настроить дату, когда нужно выполнить следующую работу. Но если установить задержку на 1 год, то мне нужно подождать 1 год до учета новой конфигурации.
Моей идеей было бы остановить запланированную задачу, если значение конфигурации будет изменено (так из другого класса). Затем пересчитайте следующий раз, когда задача должна быть выполнена. Возможно, есть более простой способ сделать это.
Вот код, который у меня есть.
@Configuration
@EnableScheduling
public class RequestSchedulerConfig implements SchedulingConfigurer {
@Autowired
SchedulerConfigService schedulerConfigService;
@Bean
public RequestScheduler myBean() {
return new RequestScheduler();
}
@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().startReplenishmentComputation();
}
},
new Trigger() {
@Override public Date nextExecutionTime(TriggerContext triggerContext) {
Duration d = schedulerConfigService.getIntervalFromDB();
return DateTime.now().plus(d).toDate();
}
}
);
}
}
Это то, что я хотел бы сделать.
@RestController
@RequestMapping("/api/config/scheduler")
public class RequestSchedulerController {
@Autowired
ApplicationConfigWrapper applicationConfigWrapper;
@RequestMapping("/set/")
@ResponseBody
public String setRequestSchedulerConfig(@RequestParam(value = "frequency", defaultValue = "") final String frequencyInSeconds){
changeValueInDb(frequencyInSeconds);
myJob.restart();
return "Yeah";
}
}