Bug:ThreadPoolTaskScheduler搭配CronTask完成定时任务,关闭scheduler后CronTask任务仍然执行?
【问题】执行下面代码后,关闭ThreadPoolTaskScheduler,CronTask仍然继续执行。
@Configuration public class config { @Bean public String getString() throws InterruptedException { Runnable runnable = () -> { try { System.out.println("hello runnable"); Thread.sleep(2000); } catch (Throwable e) { e.printStackTrace(); } }; CronTask cronTask = new CronTask(() -> { try { System.out.println("hello cronTask"); Thread.sleep(2000); } catch (Throwable e) { e.printStackTrace(); } }, "* * * * * ?"); ThreadPoolTaskScheduler testScheduler = new ThreadPoolTaskScheduler(); testScheduler.setPoolSize(2); testScheduler.initialize(); testScheduler.scheduleWithFixedDelay(runnable, 10); testScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger()); Thread.sleep(6000); testScheduler.setAwaitTerminationMillis(100); testScheduler.setWaitForTasksToCompleteOnShutdown(true); testScheduler.shutdown(); System.out.println("shutdown"); return new String("123"); } } ================================================= hello runnable hello cronTask hello runnable hello cronTask hello runnable shutdown hello cronTask
schedule(CronTask task):使用 CronTask 允许你基于 Cron 表达式定义复杂的调度规则。任务将在指定的时间点按 Cron 表达式执行,例如每天的特定时间或每小时。
scheduleWithFixedDelay(Runnable task, long delay):这个方法基于固定的延迟时间调度任务。任务在上一次执行完成后,等待指定的延迟时间,然后再次执行。适合需要间隔性执行的任务,不关心具体的执行时间。
【解决办法】
setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean executeExistingDelayedTasks)
- 如果设置为 true,在调用 shutdown 方法后,已经排定但尚未执行的延迟任务仍然会被执行。
- 如果设置为 false,则在 shutdown 后,所有已排定的延迟任务将不会被执行。
testScheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);