Spring Batch:如何将块处理作为多线程处理

时间:2016-06-19 17:07:58

标签: spring-batch

我有一个基于Spring Batch Chunk的作业(自定义阅读器,自定义处理器,自定义编写器)任何线程都应遵循此顺序。如果我启动10个线程,它们应该并行运行,按顺序执行自己的读取,处理和写入序列。

线程1 - >按顺序:读取,处理,写入

线程2 - >按顺序:读取,处理,写入等等

如何实现此行为。 目前我的代码在单线程模型中工作如下。 (我想。不确定)。 我想要批处理中的commit-interval:chunk仅为'1'(因为我需要逐行读取文件)。

<!-- Reader bean for our simple Text file -->
<bean id="productReader" class="com.mycompany.batching.reader.productItemReader"
    scope="step">
    <property name="userId" value="#{jobParameters['userId']}" />
    <property name="dataId" value="#{jobParameters['dataId']}" />
</bean>


<!-- Processor for the data red from text file -->
<bean id="productProcessor" class="com.mycompany.batching.processor.productItemProcessor">
</bean>

<!-- Persisting data to database -->
<bean id="productWriter" class="com.mycompany.batching.writer.productItemWriter">
</bean>

<batch:job id="simpleProductImportJob" xmlns="http://www.springframework.org/schema/batch">
    <batch:step id="importFileStep">
        <batch:tasklet>
            <batch:chunk reader="productReader" processor="productProcessor"
                writer="productWriter" commit-interval="1" />
        </batch:tasklet>
    </batch:step>
</batch:job>

如何制作这种多线程。?

1 个答案:

答案 0 :(得分:0)

实现此目标的最佳方法是逐步分区。 假设您的源是文件, 1.根据某些逻辑拆分文件 2.分区程序将选择文件并将每个文件分配给从属文件。

batch-context.xml

<batch:step id="fileProcessMaster">
        <batch:partition partitioner="filePartioner" step="readAndInsertToDb">
            <batch:handler task-executor="taskExecutor" />
        </batch:partition>
    </batch:step>

FilePartitioner.java

public class FilePartitioner implements Partitioner{

@Override
public Map<String, ExecutionContext> partition(int gridSize) {
     Map<String, ExecutionContext> map = new HashMap<String, ExecutionContext>();
        int i = 0;
        File[] files = new File(inboundDirectory).listFiles((FileFilter) new PrefixFileFilter(*);
        for (File file : files) {
            //Pick only those files which are splitted
            if (file.getName().contains("Split")) {
                ExecutionContext context = new ExecutionContext();
                context.putString("file", file.getAbsolutePath());
                map.put("slave" + i, context);
                i++;
            }
        }
        return map;
}

您已确保分区程序的bean配置是步骤范围的。