Почему этот шаблон cron не соответствует / запускается каждые 37 секунд? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть приложение Spring с этим свойством:

cobra.tarifas.intervaloEntreCobrancas =*/37 * * * * *

И вот где оно используется:

@Scheduled(cron = "${cobra.tarifas.intervaloEntreCobrancas}")
public void cobraTarifaDMaisZero() {

    int number = new Random().nextInt();

    System.out.println("started " + number + " at " + LocalTime.now().withNano(0));
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("finished " + number + " at " + LocalTime.now().withNano(0));
}

Так что каждый раз, когда он запускается, у меня есть журнал, который указывает, когдаон начинался и заканчивался вместе с «уникальным» идентификатором (Spring использует один и тот же экземпляр в классах @Scheduled без дополнительной настройки, this.toString каждый раз возвращал одну и ту же строку).Каждое выполнение занимает 5 секунд.

Я думал, что выражение cron означает «запускается каждый раз каждые 37 секунд», но это не так.

Использование * * * * * * Я получил это:

started -1615036471 at 10:18:46
finished -1615036471 at 10:18:51
started 2090620070 at 10:18:52
finished 2090620070 at 10:18:57
started -349207943 at 10:18:58
finished -349207943 at 10:19:03

Что имело смысл: требуется 1 с, чтобы начать новое выполнение после завершения предыдущего, всегда 5 с, чтобы завершить.Но когда я использовал */37 * * * * *, я получил

started -644623959 at 10:54
finished -644623959 at 10:54:05
started 212117957 at 10:54:37
finished 212117957 at 10:54:42
started 1788724609 at 10:55
finished 1788724609 at 10:55:05
started 362510867 at 10:55:37
finished 362510867 at 10:55:42
started -25103618 at 10:56
finished -25103618 at 10:56:05
started -820939074 at 10:56:37
finished -820939074 at 10:56:42

Почему он запускается только в секундах 00 и 37?Я хотел реализовать поведение, аналогичное @fixedDelay Spring, но гибкое, чтобы его можно было изменить в некоторых файлах свойств (@fixedDelay принимает только константы).

1 Ответ

0 голосов
/ 19 сентября 2018

Я не думаю, что на самом деле вы можете сделать это только с помощью cron для числа, такого как 37.

Самый простой вариант - выбрать приращение, которое может делить 60. По существу, четное числоэто равно (или меньше) 30.

Например, 10, 15, 20 или 30.

Для 10 ваше выражение будет:

cobra.tarifas.intervaloEntreCobrancas =0,10,20,30,40,50 * * * * *

В противном случае, вы могли бы просто пойти один раз в минуту.

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