线程池的大小通常都是我们比较关注的,SpringBoot 会为系统做默认配置。如果不清楚 SpringBoot 默认配置的线程池的大小的话,容易线上踩坑。
最近碰到一个生产问题,线上部署 6 台机器,定时任务A,B都在 17:00 执行,执行时会各自先获取分布式锁。(服务器时间是一致的)
理论上是可以做到同一时刻只有一台机器能够执行的,但实际情况是,定时任务 B 有的在 17:00.000 触发,有的机器上是 17:00.230 触发,有的机器上是 17:01.000 触发。
通过日志发现,晚触发的定时任务B都是在上一个定时任务A 执行完成之后,再执行的。而且执行的线程名都是 scheduling-1。
所以,猜想线程池可能只有一个,任务出现了等待,导致任务没有在准点触发。
查看源码发现,SpringBoot 默认配置的定时任务线程池中线程数是 1 个。
可能通过配置: spring.task.scheduling.pool.size=10 来设置线程池个数。也可以通过 TaskSchedulerCustomizer 来进行定制。
@Async 异步任务,SpringBoot 也是会进行线程池的默认配置的,默认设置的线程数是 8 个,taskQueue 的大小是无界(queueCapacity = Integer.MAX_VALUE),线程名前缀是 : task-
标签:springboot,17,默认,任务,线程,定时,SpringBoot From: https://www.cnblogs.com/kevin-yuan/p/17496374.html