springboot 默认配置的线程池

 

线程池的大小通常都是我们比较关注的,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-

 

 

posted on 2023-06-21 15:38  快鸟  阅读(1881)  评论(0编辑  收藏  举报