Spring batch corePoolSize VS throttle-limit

时间:2016-04-15 11:14:38

标签: java spring multithreading spring-batch

I'd like to know the difference between corePoolSize and throttle-limit as Spring Batch attributes defining multi threading configuration.

I've got the difference between corePoolSize and maxPoolSize thanks to this post "What is the difference between corePoolSize and maxPoolSize in the Spring ThreadPoolTaskExecutor"

But my issue concerns corePoolSize vs throttle-limit... I found that it's preferable to define CorePoolSize = Throttle-limit, but I'm wondering... if I define for example : CorePoolSize = 100 and Throttle-limit = 200... What happens ? Is a 200 sized thread pool that will be created or 100 ?

Thank you for any clarification...

2 个答案:

答案 0 :(得分:9)

核心池大小表示线程池执行程序将以N个线程数开始。限制T表示,无论线程池中可用的线程数是多少,只使用这些线程的T作为tasklet。

因此,您可以拥有一个核心池大小为8的线程池和两个限制为4的tasklet,在这种情况下,您将使用您的线程池。但是如果你只有一个节流限制为4的tasklet,那么你将使用一半的线程池。

答案 1 :(得分:0)

油门极限TaskExecutorRepeatTemplate中的spring批javadocs中进行了解释。

这是配置ThreadPoolExecutor的所有可能方法之上的另一个属性,并且可能简化了使用线程池的任务。如果您有parallel steps竞争线程,那肯定有用。

要回答您的问题,只有当corePoolSize大于maximumPoolSize且您的阻塞队列中的节流限制大于corePoolSize时,才会为您的任务创建新线程ThreadPoolExecutor已满。否则他们将例如在您的ThreadPoolExecutor中排队,或者有可能被拒绝(请参阅默认处理程序AbortPolicy)。

spring batch尝试向执行者提交比其愿意接受的任务更多的任务时,会发生什么情况取决于您的执行者。请参见ThreadPoolExecutor javadocs中的拒绝的任务

一开始有点让人困惑,但最后却很合理。

请注意,DEFAULT_THROTTLE_LIMIT是4(在我的春季版本中)。

例如,当您的ThreadPoolExecutor意外创建的线程数少于 corePoolSize 线程时,请参见此gotcha