Весеннее задание по расписанию загрузки с задержкой запуска - PullRequest
0 голосов
/ 03 июля 2019

Я использую пружинную загрузку с shedlock, чтобы моя задача расписания работала только в одном экземпляре одновременно.

Вот мой конфиг

@Configuration
@EnableScheduling
@EnableSchedulerLock(mode = 
EnableSchedulerLock.InterceptMode.PROXY_METHOD, 
defaultLockAtMostFor = "PT15M", 
defaultLockAtLeastFor = "PT2M")
public class SchedulerConfig implements SchedulingConfigurer {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
    return new JdbcTemplateLockProvider(dataSource);
}
}

Вот мое задание

@Scheduled(fixedDelayString = "2000")
@SchedulerLock(name = "ms.demo.scheduleTaskJob1")
public void scheduleTaskJob1() {
    logger.info("Fixed delay task called every 2 seconds after latest finished Execution Time - {}",dateTimeFormatter.format(LocalDateTime.now()));
}

Вот таблица Шедлок НАЗВАНИЕ LOCK_UNTIL LOCKED_AT LOCKED_BY

Проблема здесь, когда моя задача запускается в первый раз в 03-ИЮЛЬ-19 06.37.55.858685000 PM

Шедлок добавит 1 строку в БД следующим образом:

ms.demo.scheduleTaskJob1    03-JUL-19 06.52.37.178573000 PM 03-JUL-19 06.37.55.858685000 PM MB0001

Поскольку значение defaultLockAtMostFor составляет 15 минут

Когда задача завершится, она обновит эту запись, чтобы разблокировать, и строка прямо сейчас:

ms.demo.scheduleTaskJob1    03-JUL-19 06.39.37.178573000 PM 03-JUL-19 06.37.55.858685000 PM MB0001

Потому что defaultLockAtLeastFor составляет 2 минуты.

при следующем запуске задачи (2019-07-03T18: 37: 58.434650900Z) обновляется запись для получения блокировки командой sql

update shedlock set LOCK_UNTIL = '', lock_at = '' , locked_by = 'MB0001' where name = 'MB0001' and LOCK_UNTIL <= '2019-07-03T18:37:58.434650900Z';

Невозможно обновить, поэтому задача не будет запущена.

Здесь мне нужно подождать около 2 минут, пока текущее время не закончится LOCK_UNTIL (03-JUL-19 06.39.37.178573000 PM), пока моя задача настроена с задержкой 2 с Поэтому моя задача не выполняется каждые 2 секунды, как ожидалось, вместо этого она будет выполняться каждые 2 минуты.

...