Запланированное задание выполняется тысячи раз, когда компьютер выходит из спящего режима - PullRequest
4 голосов
/ 14 июля 2020

Аннотирование метода с помощью Spring @Scheduled и указание фиксированной задержки, например:

@Scheduled(fixedRate = 5000)
public void test() {
    log.info("The time is {}", Instant.now());
}

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

The time is 2020-07-14T08:00:30.358073400Z
The time is 2020-07-14T08:00:35.358969600Z
The time is 2020-07-14T08:00:40.358066100Z
...
The time is 2020-07-14T08:02:51.806689500Z
The time is 2020-07-14T08:02:51.806689500Z
The time is 2020-07-14T08:02:51.806689500Z
The time is 2020-07-14T08:02:51.806689500Z
The time is 2020-07-14T08:02:51.806689500Z
The time is 2020-07-14T08:02:51.807651500Z
The time is 2020-07-14T08:02:51.807651500Z
...

Как сделать так, чтобы он запускался только один раз, когда компьютер просыпается?

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Используйте: @Scheduled(cron = "*/5 * * * * *").

При использовании выражений cron пропущенные исполнения не ставятся в очередь.

Также, как заметил @Lino, вы указали fixedRate, а не fixedDelay. Изменение fixedRate на fixedDelay также решает вашу проблему, но учтите, что поведение может измениться, поскольку fixedDelay - это фиксированный период в миллисекундах между концом последнего вызова и началом следующего в то время как fixedRate - фиксированный период в миллисекундах между вызовами .

0 голосов
/ 14 июля 2020

Вы можете использовать флаг AtomicBoolean, который указывает, что задача уже запущена:

private final AtomicBoolean running = new AtomicBoolean(false);

А затем в запланированном методе

if (running.compareAndSet(false, true)) {
    log.info("The time is {}", Instant.now());
    running.set(false);
}

Из javado c из compareAndSet(expect, update):

Атомарно устанавливает значение для данного обновленного значения, если текущее значение == ожидаемое значение.

Возвращает : true в случае успеха. False return указывает, что фактическое значение не было равно ожидаемому.

Итак, if проверит, что в данный момент не запущена ни одна задача, и только тогда выполнит ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...