Spring boot Spring启动批处理-ThreadPoolTaskExecutor未处理所有线程
通过定义节流限制解决:此处定义了相同的问题 我将Spring引导与Spring批处理一起使用,并具有以下TaskExecutor配置Spring boot Spring启动批处理-ThreadPoolTaskExecutor未处理所有线程,spring-boot,spring-batch,Spring Boot,Spring Batch,通过定义节流限制解决:此处定义了相同的问题 我将Spring引导与Spring批处理一起使用,并具有以下TaskExecutor配置 @Bean public ThreadPoolTaskExecutor getJobTaskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(10); taskExecut
@Bean
public ThreadPoolTaskExecutor getJobTaskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(10);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(0);
taskExecutor.setThreadNamePrefix("ProcessJob-");
taskExecutor.afterPropertiesSet();
taskExecutor.initialize();
return taskExecutor;
}
我注意到,当我使用20K记录运行批处理时,一些线程已经开始处理,但在10个请求后停止。但是,其他线程正在正确处理。你能不能提出可能的问题?如果我保持CorePoolSize=ThreadPoolSize=5,那么所有线程都会正确分布
CorePoolSize=MaxPoolSize=10 (Threads are not distributed properly)
Thread Name Count
---------------------------
Thread-ProcessJob-1 10
Thread-ProcessJob-10 4200
Thread-ProcessJob-2 10
Thread-ProcessJob-3 10
Thread-ProcessJob-4 10
Thread-ProcessJob-5 1290
Thread-ProcessJob-6 10
Thread-ProcessJob-7 4980
Thread-ProcessJob-8 4479
Thread-ProcessJob-9 4999
您正在将任务执行者的队列容量设置为0,这可能是问题的原因。这里还有一个参数可能起作用,它是步骤的
throttleLimit
,默认值为4。您应该尝试增加它,并为您的用例找到最佳价值
这里有多个因素:线程池核心/最大大小、步骤的chunkSize和throttleLimit、taskExecutor队列大小等。所有这些因素都可能在观察到的现象中起作用,没有找到最佳组合的方法,您需要以经验的方式进行。我认为Spring批处理或Spring引导无法控制JVM如何跨池中的线程分配工作。这在不同的执行中应该有所不同。这里有一个参数可能起作用,它是步骤的
throttleLimit
,默认值为4。当您使用CorePoolSize=MaxPoolSize=10时,您是否尝试过增加它?谢谢您,马哈茂德。当我删除了<代码> TaskExcExtuor。StRealQueRePosial[1](0),这样TaskExtor可以考虑缺省值,这是无限的任务,所以问题得到解决,但是性能急剧下降。让我尝试使用throttleLimit
并进行验证。非常感谢。我看到了这个taskExecutor.setQueueCapacity(0)
,我想知道你为什么这么做,但我在之前的评论中忘了提到它。这里有多个因素:线程池核心/最大大小、步骤的chunkSize和throttleLimit、taskExecutor队列大小等。所有这些因素都可能在观察到的现象中起作用,并且没有找到最佳组合的方法,您需要以经验的方式进行。这是一个有趣的问题,我会对你的发现感到好奇。@MahmoudBenHassine在向MaxPoolsize添加节流限制后,能够使用所有线程以及我们看到的底层WS-call流量。性能仍然没有提升。从WS获得响应后,我使用ItemWriter将其写入多个DB。我使用的是@Transactional
注释,在某个地方读到它不应该被使用,而Spring batch应该使用它自己的事务管理器,但不知道这是否会导致任何性能问题。性能和事务问题是不同的问题,您可以就此提出不同的问题在向MaxPoolsize添加节流限制后,能够使用所有线程以及我们看到的底层WS-call流量。
:基于此,我假设您按照我的建议更新节流限制,从而解决了问题。对吗?如果这是正确的,你会接受一个答案,如果我添加一个与该内容?
CorePoolSize=MaxPoolSize=5 (Threads are distributed properly)
Thread-ProcessJob-1 1199
Thread-ProcessJob-2 1201
Thread-ProcessJob-3 1214
Thread-ProcessJob-4 1211
Thread-ProcessJob-5 1209