В моем весеннем загрузочном приложении у меня запланированы задания с аннотацией Asyn c и аннотацией по расписанию. Asyn c помогает распараллелить задачи, если задача выполняется больше времени, чем значение fixedRate / delay / cron. Код так же прост, как показано ниже
@Async
@Scheduled(fixedRateString = "${scheduler.fixedRateToLoadOldest}")
public void scheduleFixedRateTaskAsync() throws InterruptedException {
logger.info("Job"+Thread.currentThread().getName());
}
Теперь я хочу динамически изменить выражение fixedRate или CRON во время выполнения. Благодаря spring-cloud-config, в качестве клиента конфигурации я получаю обновленный параметр конфигурации. Но простое добавление аннотации RefreshScope к методу или классу не помогает, поскольку Запланированная аннотация обрабатывается во время запуска и никогда не обрабатывается повторно . Затем я попытался использовать триггер, и благодаря реализации метода nextExecutionTime я могу управлять fixedRate / delay / cron, но только между выполнением задачи . Это мой код для динамического c триггера
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(poolScheduler());
//taskRegistrar.getScheduler().schedule(this::work, cronTrigger()); //one way to schedule
taskRegistrar.addTriggerTask(() -> this::work, t -> {
Calendar nextExecutionTime = new GregorianCalendar();
Date lastActualExecutionTime = t.lastActualExecutionTime();
nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
nextExecutionTime.add(Calendar.MILLISECOND, configParameters.getFixedRate()); //configParameters has refreshscope
return nextExecutionTime.getTime();
});
}
Это означает, что задача будет выполняться только последовательно, даже если я использую taskscheduler . Таким образом, если выполнение одной задачи занимает больше времени, ожидание следующей задачи выполняется другим потоком. Я хочу знать, как распараллеливать / asyn c задачи при динамическом изменении фиксированной скорости / задержки / cron?
Разве это не поддерживается в расписании Spring?
Будет ли это поддерживать Кварц?