我有一个问题,那就是如何最好地根据我的需求来实现一个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中执行),这样我就可以并行处理每一组。我试图找出一种方法,在单独的步骤中使用分块来完成这个分组过程,但我不知道如何将集合中的每一项分配到单独的块中。如果您有任何想法,我将不胜感激。谢谢。
发布于 2020-08-28 09:52:55
下面是我的面向块处理的Spring批处理配置:
@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写出,然后提交事务。
https://stackoverflow.com/questions/63625412
复制相似问题