Spring Boot: @Scheduled с определением Cron будет запускаться сразу после запуска приложения - PullRequest
2 голосов
/ 04 февраля 2020

Я ожидал, что выражение 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");
    }
}

1 Ответ

2 голосов
/ 04 февраля 2020

Вы можете отложить начальный запуск расписания и переходить на выполнение каждые 2 минуты

 @Scheduled(fixedDelay = 120000, initialDelay = 3000)
...