Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
Concurrency Spring批处理同时处理多个文件_Concurrency_Spring Batch - Fatal编程技术网

Concurrency Spring批处理同时处理多个文件

Concurrency Spring批处理同时处理多个文件,concurrency,spring-batch,Concurrency,Spring Batch,我正在使用SpringBatch处理一个大型XML文件(约200万个实体)并更新数据库。这个过程非常耗时,所以我尝试使用分区来加速处理 我所采用的方法是将大型xml文件拆分为较小的文件(比如每500个实体),然后使用SpringBatch并行处理每个文件。 我正在努力使用Java配置来实现并行处理多个xml文件。这些是我的配置的相关bean @Bean public Partitioner partitioner(){ MultiResourcePartitioner partition

我正在使用SpringBatch处理一个大型XML文件(约200万个实体)并更新数据库。这个过程非常耗时,所以我尝试使用分区来加速处理

我所采用的方法是将大型xml文件拆分为较小的文件(比如每500个实体),然后使用SpringBatch并行处理每个文件。 我正在努力使用Java配置来实现并行处理多个xml文件。这些是我的配置的相关bean

@Bean
public Partitioner partitioner(){
    MultiResourcePartitioner partitioner = new MultiResourcePartitioner();

    Resource[] resources;
    try {
        resources = resourcePatternResolver.getResources("file:/tmp/test/*.xml");
    } catch (IOException e) {
        throw new RuntimeException("I/O problems when resolving the input file pattern.",e);
    }
    partitioner.setResources(resources);
    return partitioner;
}

@Bean
public Step partitionStep(){
    return stepBuilderFactory.get("test-partitionStep")
            .partitioner(personStep())
            .partitioner("personStep", partitioner())
            .taskExecutor(taskExecutor())
            .build();
}

@Bean
public Step personStep() {
    return stepBuilderFactory.get("personStep")
            .<Person, Person>chunk(100)
            .reader(personReader())
            .processor(personProcessor())
            .writer(personWriter)
            .build();
}

@Bean
public TaskExecutor taskExecutor() {
    SimpleAsyncTaskExecutor asyncTaskExecutor = new SimpleAsyncTaskExecutor("spring_batch");
    asyncTaskExecutor.setConcurrencyLimit(10);
    return asyncTaskExecutor;
}
@Bean
公共分区器分区器(){
MultiResourcePartitioner partitioner=新的MultiResourcePartitioner();
资源[]资源;
试一试{
resources=resourcepatternsolver.getResources(“文件:/tmp/test/*.xml”);
}捕获(IOE异常){
抛出新的RuntimeException(“解析输入文件模式时出现I/O问题。”,e);
}
partitioner.setResources(资源);
返回分区器;
}
@豆子
公共步骤partitionStep(){
返回stepBuilderFactory.get(“testpartitionstep”)
.partitioner(personStep())
.partitioner(“personStep”,partitioner())
.taskExecutor(taskExecutor())
.build();
}
@豆子
公共步骤personStep(){
返回stepBuilderFactory.get(“personStep”)
.chunk(100)
.reader(personReader())
.processor(personProcessor())
.作者(personWriter)
.build();
}
@豆子
公共任务执行器任务执行器(){
SimpleAsyncTaskExecutor asyncTaskExecutor=新的SimpleAsyncTaskExecutor(“spring_批处理”);
asyncTaskExecutor.SetConcurrencyLit(10);
返回异步任务执行器;
}
当我执行作业时,会出现不同的XML解析错误(每次都是不同的错误)。如果我从文件夹中删除所有xml文件,只有一个,那么处理工作将按预期进行

我不确定我是否100%理解Spring批处理分区的概念,尤其是“从”部分


谢谢

如果您遇到XML解析错误,我敢打赌您没有正确地拆分XML文件。每个文件必须是完整有效的XML文档。包括您收到的实际错误以及如何分割原始文件将有助于我们进一步帮助您。您的阅读器线程安全吗?您可能想尝试将其放入步骤作用域中。@deanclk否,读取器不是线程安全的。您能解释一下“放入步骤范围”吗?请更正
StateVentitemReader
不是线程安全的,但我假设您将其配置为
StepScope
,以便每个分区都有一个唯一的实例。如果不是这样,是的,你会看到你看到的错误类型。这里简要地描述了。它将为每个分区/线程创建一个实例,还允许对步骤执行中的值进行后期绑定。每个线程有一个实例可以解决您的问题。