java - 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 中执行),以便我可以并行处理每个组。我试图找出一种方法来在单独的步骤中使用分块来执行此组过程,但我无法弄清楚如何将集合中的每个项目分配给单独的块。我会很感激任何想法。谢谢。
解决方案
这是我的面向块的处理的 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 写出整个块,然后提交事务。
推荐阅读
- php - 如何在 PHP Simple XML 中集成一个链接来解析
- java - 如何在JTable(JAVA)中显示FK ID的引用
- css - 如何在Foundation XY-grid(flexbox)中均匀分布单元格高度
- deep-learning - 关于二维人体姿态检测的两个问题
- python - 使用 pandas.read_csv 时如何忽略一些不在引号内的逗号?
- marker - Mapbox GL JS 标记超出地图
- android - 更新数据库后刷新活动或列表视图
- postgresql - Gorm 无法连接到本地 postgres 数据库
- python - TypeError:“numpy.float64”对象不能被解释为整数并且转换为 int 失败
- stata - 为 pid 的所有值重塑数据