Почему @Scheduled с fixedDelay не защищает от параллельного запуска на двух подах

fixedDelay и fixedRate управляют интервалом между запусками задачи внутри одного планировщика. Это локальная настройка одного инстанса JVM — она ничего не знает про другие поды того же сервиса.

Если сервис задеплоен в двух экземплярах, у каждого свой Spring-контекст и свой scheduler. Оба поднимут задачу по своему локальному расписанию, независимо друг от друга. На собеседовании это часто подают как вопрос про корректность — а на деле это вопрос про распределённую координацию, которой аннотация не занимается вообще.

@Scheduled(fixedDelay = 3600000) public void cleanupSessions() { sessionRepository.deleteExpired(); }

Спросят следом: как сделать так, чтобы задача выполнялась ровно одним инстансом. Ответы уровня миддл — ShedLock с распределённым локом в БД или Redis, либо вынести cron-логику в отдельный сервис с одной репликой. Ответ уровня сеньора — ещё и что произойдёт при падении инстанса, который держал лок: нужен TTL на лок, иначе задача не выполнится никогда, пока лок не истечёт вручную.

Аннотация выглядит как про время. Вопрос на самом деле про то, сколько инстансов её читают.

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки