Весенние запланированные задания Cron запускаются в неподходящее время

У меня есть приложение Spring Boot с различными планировщиками, использующими аннотацию @Scheduled. Некоторые расписания настраиваются с использованием fixedRate, другие - cron. Расписания fixedRate работают нормально, но я заметил, что за последний месяц фактическое время срабатывания расписаний cron будет варьироваться на 1-2 часа каждый день.

то есть работа с настройкой cron

@Scheduled(cron = "0 0 2 * * *")

сработает в 3:00 вместо 2:00. Это происходит не каждый день. Он будет работать в одно и то же время несколько дней подряд, затем что-то произойдет, и он отключается еще на час при каждом запуске, пока я не перезапущу приложение.

Системное время на сервере точное, у меня тут все без идей. Кто-нибудь сталкивался с этим раньше?

ИЗМЕНИТЬ 1

Я ввел некоторый журнал, чтобы определить, не выполнялись ли задания с ошибками с одним и тем же интервалом, и результаты кажутся случайными. Вот время начала и окончания вышеупомянутого задания cron за три дня:

Format: Calendar.getInstance().getTime() (System.currentTimeMillis())

Start: Sat Oct 21 03:14:15 CDT 2017 (1508573655778)
End:   Sat Oct 21 03:22:24 CDT 2017 (1508574144708)

Start: Sun Oct 22 02:26:58 CDT 2017 (1508657218774)
End:   Sun Oct 22 02:35:12 CDT 2017 (1508657712492)

Start: Mon Oct 23 02:00:03 CDT 2017 (1508742003072)
End:   Mon Oct 23 02:08:11 CDT 2017 (1508742491493)

person Brian Smith    schedule 20.10.2017    source источник


Ответы (2)


Наконец разобрался. У меня не было настройки ThreadPoolTaskScheduler, поэтому у меня не было достаточно большого пула потоков, выделенного для выполнения всех моих запланированных заданий.

@Configuration
public class TaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(30);
        return threadPoolTaskScheduler;
    }

}
person Brian Smith    schedule 06.11.2017
comment
У меня та же проблема (задание запланировано на 1.30 AM, запуск ± 9 AM, предшествуют длительные задания, хотя есть некоторые контрдоказательства к однопоточности), но это мне не помогло (Spring Boot 1.5, Spring 4.3). Я пробовал в качестве возвращаемого типа и ThreadPoolTaskScheduler, и TaskScheduler. Мне трудно понять документацию по этому поводу :( - person Jakub Holý; 22.05.2019
comment
@Brian Smaith - это достаточный код выше. или нам нужно установить его в ScheduledTaskRegistrar. нужно ли нам использовать какие-либо другие аннотации для нашего запланированного метода получения потоков из ThreadPoolTaskScheduler. - person raj_kumar_junior; 13.11.2020
comment
@raj_kumar_junior Это работало в более старом приложении и версии Spring / Java. Во время его работы нам не нужно было настраивать ScheduledTaskRegistrar. Так может быть и в более новых версиях. - person Brian Smith; 20.04.2021

Он срабатывает ровно на 1 час каждый раз, или это переменная, как вы упомянули? Как вы измеряете время срабатывания - с помощью регистрации? И сколько времени требуется для запуска метода, который вы аннотируете? Зарегистрируйте сообщение в начале и в конце метода и сравните эти временные метки. Вы можете попробовать использовать

private static final String CRON_SCHEDULE = "0 0 2 * * ?";
private static final String USER_TIMEZONE = "America/New_York";
// ...
@Scheduled(cron = CRON_SCHEDULE, zone = USER_TIMEZONE)
/* your method here */

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

person Blake    schedule 20.10.2017
comment
Привет, Блейк. В прошлую пятницу я добавил журналы и позволил им поработать на выходных, чтобы собрать некоторые результаты. Я опубликовал эти результаты в своем первоначальном вопросе. - person Brian Smith; 23.10.2017
comment
Да, похоже, что время начала увольняется не по расписанию, если это то, что они должны делать. Какие еще у вас есть аннотации? есть ли запланированный метод в компоненте Spring, контроллере или классе обслуживания? - person Blake; 25.10.2017
comment
Наконец разобрался. У меня не было настройки ThreadPoolTaskScheduler, поэтому не было достаточно большого размера пула для поддержки всех моих запланированных заданий. Один будет срабатывать, другие либо будут заблокированы, либо будут помещены в какую-то внутреннюю очередь, но когда они в конечном итоге сработают, часы cron смещены на то, как долго они были в очереди / заблокированы. - person Brian Smith; 07.11.2017