@Schedule注解实现定时任务分析
Spring的@Scheduled的默认线程池数量为1,也就是说定时任务是单线程执行的。这意味着最多同时只有一个任务在执行。当一个任务还在执行时,其他任务会等待其完成,然后按照其预定的执行策略依次执行。
比如以下案例:
testCronJob本该10s执行一次,但由于testFixedRateJob执行时间较长,且第二个任务使用的fixRate是固定速率 上一次任务执行开始到下一次执行开始的间隔时间固定,单位为ms。 若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后,马上执行下一次任务
这就导致了testCronJob并不能按时执行,可能多次被插队。
可以添加以下配置设置定时任务执行的线程池大小:
# 设置任务调度线程名称前缀
spring.task.scheduling.thread-name-prefix=task-schedule-
# 设置任务调度线程池大小
spring.task.scheduling.pool.size=10
# 设置任务调度线程池关闭时等待所有任务完成
spring.task.scheduling.shutdown.await-termination=true