我正在使用Spring Boot + Spring Task Scheduler创建一个轮询应用程序。我计划在维护窗口期间使用执行器关闭应用程序(请参阅执行器的关闭端点:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints)。
我的问题是,在优雅地关闭应用程序之前,Spring是否足够智能完成一个正在进行的任务?如果飞行中的任务在关机前完成,那么Spring是否足够聪明,不会启动另一项任务?
谢谢。
您可以通过设置来控制它
ThreadPoolTaskExecutor#waitForTasksToCompleteOnShutdown
为真。
在继承的setter的javadoc中有一个非常好的解释
org.springframework.scheduling.concurrent.ExecutorConfigurationSupport#setWaitForTasksToCompleteOnShutdown
设置是否等待计划任务在关闭时完成,不中断正在运行的任务并执行队列中的所有任务。
默认为“false”,通过中断正在进行的任务和清除队列立即关闭。如果您更喜欢完全完成的任务,而不是更长的停机阶段,请将此标志切换为“true”...
spring scheduler使用默认值a
java.util.concurrent.ThreadPoolExecutor
如javadoc中所述,它不会在关机期间启动新任务
java.util.concurrent.ThreadPoolExecutor#shutdown
启动以前提交的任务执行的有序关闭,但不接受任何新任务...
从spring boot 2.1开始,您可以设置以下属性
# Whether to wait for running jobs to complete on shutdown.
spring.quartz.wait-for-jobs-to-complete-on-shutdown=false