背景描述
当springbatch任务处理缓慢时,就需要使用多线程并行处理任务。
参数throttle-limit用于控制当前任务能够使用的线程数的最大值。
调整throttle-limit为10时,处理线程只有8,再次增大throttle-limit值为20,处理线程依旧为8,并未生效。
问题原因
throttle-limit
控制的是单个任务能够从线程池中获取的线程数的最大值,从这个值的注释说明可以看到,实际任务能够拿到的线程数量,不仅受throttle-limit
参数控制,同时也受线程池的核心线程数配置影响。
原因很好理解,好比一个筐里只有十个苹果,就算规定可以拿20个苹果,其实也只能从筐子里拿到十个。
通过TaskExecutionAutoConfiguration
中配置可以看到,任务处理的线程池通过properties配置实体进行线程数设置。
而properties中,核心线程数默认为8。即没有对线程池进行配置的情况下,一个任务到顶,撑死只能拿到8个线程。而throttle-limit
默认配置为4,超过8时,则不会继续变大。
解决方案
当我们确实需要增加throttle-limit
的值的时候,就必须先把线程池的线程数配置调大。
springbatch暴露了该配置项,支持任务处理线程池的调整。
配置项前缀为:spring.task.execution
线程池配置参数前缀:spring.task.execution.pool
即,在properties文件中,增加如下配置:
# 任务处理线程池线程数配置参数
### 核心线程数
spring.task.execution.pool.core-size=30
### 最大线程数
spring.task.execution.pool.max-size=30
### 等待队列容量
spring.task.execution.pool.queue-capacity=100
更多配置项,参考TaskExecutionProperties
内容。
修改配置后,设置throttle-limit
值为20,启动任务,可以看到并行处理的线程数达到了20个。