温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Spring batch multithreading using partitioning
multithreading spring-batch

其他 - 使用分区的Spring Batch多线程

发布于 2020-03-28 23:19:21

我的问题陈述是-我必须将多个文件传递给spring批处理读取器,并且读取器以parellel运行。如果我们使用grid-size = 100,则将有100个不合逻辑的线程。解决此问题的方法是什么,即处理线程数量有限的许多文件。

@Bean
    public Step orderStep1() throws IOException {
        return stepBuilderFactory.get("orderStep1")
                .partitioner("slaveStep", partitioner())
                .step(slaveStep())
                .gridSize(100)
                .taskExecutor(taskExecutor())
                 .build();
    }

Task executor will be
@Bean
    public TaskExecutor taskExecutor() {
        SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
        return taskExecutor;
    }

partitoner will be
public Map<String, ExecutionContext> partition(int gridSize) {

      Map<String, ExecutionContext> partitionData = new HashMap<String, ExecutionContext>();  
      for (int i = 0; i < gridSize; i++) {
            ExecutionContext executionContext = new ExecutionContext();
            executionContext.putString("file", fileList.get(i)); //passing filelist
            executionContext.putString("name", "Thread" + i);
           partitionData.put("partition: " + i, executionContext);
        }

        return partitionData;
    }

并使用stepExecutionContext动态传递文件

查看更多

查看更多

提问者
priya
被浏览
127
Mahmoud Ben Hassine 2020-01-31 17:25

如果我们使用grid-size = 100,那么将有100个线程是不合逻辑的

网格大小和线程池大小是两个不同的东西。您可以处理100个分区,但只有10个工作线程可用。

您遇到的问题是您正在使用,SimpleAsyncTaskExecutor而后者不会重复使用线程(请参见其Javadoc)。因此,对于每个分区,将创建一个新线程,最终您将看到100个分区的100个线程。

解决此问题的方法是什么,即处理线程数量有限的许多文件。

考虑使用ThreadPoolTask​​Executor,以便可以限制辅助线程的数量。