Spring schedule graceful shutdown not working when using a cron scheduled
Asked Answered
F

2

7

I have a small standalone application that configures the scheduler to terminate gracefully. With the following configuration:

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

I can get it to gracefully terminate the scheduler, but only if I don't have any @Scheduled(cron = ) task. Once I have one of those, no matter what the scheduler will get stuck until timeout. I already tried configuring it also with an executor and do the shutdown/await manually and the effect is exactly the same.

These cron jobs are not even running. They are set to run at a fixed time during the night for example.

Spring version: 4.2.8.RELEASE

This will happen when the timeout reaches the end:

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

Any thoughts?

Fortify answered 28/7, 2017 at 0:15 Comment(1)
That is right. Nice catch. Maybe you could promote it to an answer so I can accept it. Thanks.Fortify
C
6

Because by default the ScheduledThreadPoolExecutor will wait for all delayed scheduled tasks to finish executing, even if scheduled tasks aren't running at that time.

Try this below:

@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;
}

Then the ScheduledThreadPoolExecutor will only wait for scheduled tasks which are currently running to finish executing.

Coccidiosis answered 14/12, 2018 at 9:9 Comment(1)
how to implement the getScheduledThreadPoolExecutor() method?Cestar
C
2

Possible bug in that version of Spring? Refer to jira.spring.io/browse/SPR-15067

Craniology answered 26/9, 2017 at 18:45 Comment(1)
This timeout error is still an issue in 2023Spinescent

© 2022 - 2024 — McMap. All rights reserved.