我有一个Spring-Boot应用程序,其中有一个bean以大约1分钟的间隔运行一个预定任务,这个bean有一个@PreDestroy方法。是否有一种解决办法,使目前正在执行的任务能够在生命周期达到销毁前阶段之前完成-或至少有一段时间来完成?
@PreDestroy
yks3o0rb1#
从Sping Boot 2.1.0开始,您可以使用:
@Bean TaskSchedulerCustomizer taskSchedulerCustomizer() { return taskScheduler -> { taskScheduler.setAwaitTerminationSeconds(60); taskScheduler.setWaitForTasksToCompleteOnShutdown(true); }; }
TaskSchedulerCustomizer将用于修改已配置的ThreadPoolTaskScheduler详细信息:1.执行官职位支持
TaskSchedulerCustomizer
ThreadPoolTaskScheduler
rkttyhzu2#
您需要更新ThreadPoolTaskScheduler的配置。为waitForJobsToCompleteOnShutdown设置true(方法setWaitForTasksToCompleteOnShutdown)。来自文件:设置是否在关机时等待计划任务完成,不中断正在运行的任务并执行队列中的所有任务。默认值为“false”,即通过中断正在进行的任务并清除队列来立即关机。如果您希望完全完成任务,但需要较长的关机阶段,请将此标志切换为“true”。
waitForJobsToCompleteOnShutdown
setWaitForTasksToCompleteOnShutdown
aydmsdu93#
@Matej是对的。像这样的东西应该会起作用
@Bean public ThreadPoolTaskScheduler setSchedulerToWait(ThreadPoolTaskScheduler threadPoolTaskScheduler){ threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true); return threadPoolTaskScheduler; }
r8uurelv4#
在以后版本的spring Boot 中,还可以通过application.properties设置这些属性。
application.properties
server.shutdown=graceful spring.lifecycle.timeout-per-shutdown-phase=60s spring.task.execution.shutdown.await-termination=true spring.task.execution.shutdown.await-termination-period=60s spring.task.scheduling.shutdown.await-termination=true spring.task.scheduling.shutdown.await-termination-period=60s
4条答案
按热度按时间yks3o0rb1#
从Sping Boot 2.1.0开始,您可以使用:
TaskSchedulerCustomizer
将用于修改已配置的ThreadPoolTaskScheduler
详细信息:
1.执行官职位支持
rkttyhzu2#
您需要更新
ThreadPoolTaskScheduler
的配置。为waitForJobsToCompleteOnShutdown
设置true(方法setWaitForTasksToCompleteOnShutdown
)。来自文件:
设置是否在关机时等待计划任务完成,不中断正在运行的任务并执行队列中的所有任务。默认值为“false”,即通过中断正在进行的任务并清除队列来立即关机。如果您希望完全完成任务,但需要较长的关机阶段,请将此标志切换为“true”。
aydmsdu93#
@Matej是对的。像这样的东西应该会起作用
r8uurelv4#
在以后版本的spring Boot 中,还可以通过
application.properties
设置这些属性。