Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring启动批处理-ThreadPoolTaskExecutor未处理所有线程_Spring Boot_Spring Batch - Fatal编程技术网

Spring boot Spring启动批处理-ThreadPoolTaskExecutor未处理所有线程

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

通过定义节流限制解决:此处定义了相同的问题

我将Spring引导与Spring批处理一起使用,并具有以下TaskExecutor配置

@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