首页 > 解决方案 > Springbatch - 如何使用分块或类似方法拆分工作

问题描述

我有一个关于如何最好地根据我的需要进行 springbatch 分块实现的问题。目前,我有一份工作,我从数据库中读取一个集合。该集合实质上将数据分组映射到检索信息。有点像:

GROUPING    RETRIEVAL INSTRUCTIONS
GRP-01      <instructions for group 01>
GRP-02      <instructions for group 02>
..
..
GRP-N       <instructions for group N>

目前我有类似于下面的内容(为清楚起见,省略了一些细节);

public class BatchConfig {

.
.

@Bean
public ItemReader<CollectionDto> databaseCursorItemReader(DataSource dataSource) {
    return new JdbcCursorItemReaderBuilder<CollectionDto>()
            .name("cursorItemReader")
        .dataSource(dataSource)
        .sql(GET_DATA)
        .rowMapper(new BeanPropertyRowMapper<>(CollectionDto.class))
            .build();
}

@Bean
ItemProcessor<CollectionDto, CollectionDto> databaseXmlItemProcessor() {
    return new QueryLoggingProcessor();
}

@Bean
public ItemWriter<CollectionDto> databaseCursorItemWriter() {
    return new GroupingWriter();
} 

.
.

}

public class GroupingWriter implements ItemWriter<CollectionDto> {

@Override
public void write(List<? CollectionDto> list) {

for(CollectionDto group : list) {

   <processing here one group at a time>

}

我遇到的问题是我与之交互的系统的性质使这太慢了。所以我想通过分块来拆分工作(当前在上面的 GroupingWriter 中执行),以便我可以并行处理每个组。我试图找出一种方法来在单独的步骤中使用分块来执行此组过程,但我无法弄清楚如何将集合中的每个项目分配给单独的块。我会很感激任何想法。谢谢。

标签: javaspringspring-batch

解决方案


这是我的面向块的处理的 Spring Batch 配置:

@Bean
public Job myJob() {
    return jobBuilders.get("myJob")
        .start(chunkStep())
        .build();
}

@Bean
public Step chunkStep() {
    return stepBuilderFactory.get("my_step")
            .<InputData, OutputData>chunk(20).faultTolerant()
             .reader(databaseCursorItemReader())
            .processor(processor())
            .writer(databaseCursorItemWriter())
            .build();
}

在面向块的处理中,每个单独的项目都从 ItemReader 读取,交给 ItemProcessor,然后聚合。一旦读取的项目数等于提交间隔(即上例中的 20),则通过 ItemWriter 写出整个块,然后提交事务。


推荐阅读