Я ожидал, что выражение cron в аннотации @Scheduled
, равной "0 */2 * * * ?"
, будет выполняться ровно каждые 2 минуты (± несколько миллисекунд). Фактически оператор @Scheduled
выполняется один раз непосредственно при запуске приложения после завершения Spring Autowiring. Как настроить Spring, чтобы он не запускался @Scheduled
после запуска приложения. В качестве обходного пути я использовал логическое значение private boolean isInit = true;
, но неудобно, если Spring не делает это правильно.
Я использую Spring Boot: 2.2.4-RELEASE
Приложение: Вопрос не в том, чтобы запускать задание каждые две минуты. Речь идет о том, как заставить Spring Boot запускать расписание точно так, как определено в операторе cron. Это лишь минимальный пример, демонстрирующий эффект.
Фрагмент кода:
@Component
public class TestScheduler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Scheduled(cron = "0 */2 * * * ?")
public void run() {
logger.info("TestScheduler run");
}
}
Вывод журнала:
2020-02-04 17:27:45.553 INFO 25868 --- [ restartedMain] d.d.d.t.s.TestApplication : Starting TestApplication [...]
[...]
2020-02-04 17:27:52.261 INFO 25868 --- [ restartedMain] d.d.d.t.s.runner.TestScheduler : TestScheduler run
[...]
2020-02-04 17:28:00.002 INFO 25868 --- [ scheduling-1] d.d.d.t.s.runner.TestScheduler : TestScheduler run
[...]
2020-02-04 17:30:00.002 INFO 25868 --- [ scheduling-1] d.d.d.t.s.runner.TestScheduler : TestScheduler run
Решено:
В коде произошла ошибка из-за этой строки над методом @Autowired // private Config config;
и большого количества комментариев между этой строкой и @Scheduled
Я пропускаю эту ошибку. @Autowired
вызвал метод для вызова в процессе подключения.
Благодаря lugiorgi
Результирующий код:
@Component
public class TestScheduler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired // private Config config;
@Scheduled(cron = "0 */2 * * * ?")
public void run() {
logger.info("TestScheduler run");
}
}