Грациозное отключение по расписанию Spring не работает при использовании расписания cron

У меня есть небольшое автономное приложение, которое настраивает планировщик для корректного завершения. Со следующей конфигурацией:

@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setWaitForTasksToCompleteOnShutdown(true);
    scheduler.setAwaitTerminationSeconds(60);
    return scheduler;
}

Я могу заставить его изящно завершить планировщик, но только если у меня нет задачи @Scheduled(cron =). Как только у меня есть один из них, независимо от того, что планировщик застрянет до истечения времени ожидания. Я уже пытался настроить его также с помощью исполнителя и выполнить отключение / ожидание вручную, и эффект точно такой же.

Эти задания cron даже не выполняются. Они настроены на запуск в фиксированное время, например, ночью.

Весенняя версия: 4.2.8.РЕЛИЗ

Это произойдет, когда тайм-аут достигнет конца:

2017.07.28 01:44:56 [Thread-3] WARN  Timed out while waiting for executor 'taskScheduler' to terminate

есть идеи?


person rpvilao    schedule 28.07.2017    source источник
comment
Это верно. Хорошо поймал. Может быть, вы могли бы повысить его до ответа, чтобы я мог его принять. Спасибо.   -  person rpvilao    schedule 26.09.2017


Ответы (2)


Потому что по умолчанию ScheduledThreadPoolExecutor будет ждать завершения выполнения всех отложенных запланированных задач, даже если запланированные задачи в это время не выполняются.

Попробуйте это ниже:

@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler() {
        private static final long serialVersionUID = -1L;
        @Override
        public void destroy() {
            this.getScheduledThreadPoolExecutor().setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
            super.destroy();
        }
    };
    scheduler.setWaitForTasksToCompleteOnShutdown(true);
    scheduler.setAwaitTerminationSeconds(60);
    return scheduler;
}

Затем ScheduledThreadPoolExecutor будет ждать завершения выполнения запланированных задач, которые в данный момент выполняются.

person hkw    schedule 14.12.2018

Возможная ошибка в этой версии Spring? См. jira.spring.io/browse/SPR-15067.

person user1491636    schedule 26.09.2017