Весной как распараллелить динамически запланированное задание - PullRequest
0 голосов
/ 01 апреля 2020

В моем весеннем загрузочном приложении у меня запланированы задания с аннотацией 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?

Будет ли это поддерживать Кварц?

...