Я использую пружинную загрузку с 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 минуты.