Spring batch RepositoryItemReader正在跳过块
我使用RepositoryItemReader从数据库中读取记录,并使用面向块的方法处理这些记录。我使用100作为页面大小和提交间隔。 读卡器的查询在where条件下有“timestamp”,当100个块获得进程并提交时,该日期将通过块处理得到更新。我运行的问题是,假设我有986条记录,需要读取并更新大小为100(1-100)的数据块中的日期。所有第一次都按预期工作,但当它拾取第二个块时,它正在处理201-300,而不是意外的101-200。这种模式继续下去,第三次是501-600,以此类推。模式第一次跳过100次,第二次跳过200次,以此类推。是我的块更新和提交导致了这种情况吗?请告知如何修复此问题,以便它可以处理所有记录 Spring批处理版本:4.0.1.0版本Spring batch RepositoryItemReader正在跳过块,spring-batch,Spring Batch,我使用RepositoryItemReader从数据库中读取记录,并使用面向块的方法处理这些记录。我使用100作为页面大小和提交间隔。 读卡器的查询在where条件下有“timestamp”,当100个块获得进程并提交时,该日期将通过块处理得到更新。我运行的问题是,假设我有986条记录,需要读取并更新大小为100(1-100)的数据块中的日期。所有第一次都按预期工作,但当它拾取第二个块时,它正在处理201-300,而不是意外的101-200。这种模式继续下去,第三次是501-600,以此类推。模
Code:
@Autowired
private MpImportRepository importRepo;
@Autowired
JpaTransactionManager jpaTransactionManager;
@Autowired
private MpImportRepository importRepo;
@Bean
@StepScope
public RepositoryItemReader<MpImport> importDataReader() {
RepositoryItemReader<MpImport> reader = new RepositoryItemReader<>();
reader.setPageSize(100);
reader.setRepository(importRepo);
reader.setMethodName("findAllImportedMissingPersons");
reader.setSort(Collections.singletonMap("missingDate", Sort.Direction.ASC));
return reader;
}
@Bean
@Qualifier("mpDataExtractAndSaveToYrstJob")
public Job mpDataExtractAndSaveToYrstJob() {
return jobBuilderFactory.get("mpDataExtractAndSaveToYrstJob")
.incrementer(new RunIdIncrementer())
.listener(jobCompletionListener)
.flow(mpDataExtractAndSaveToYrstStep())
.end().build();
@Bean
@Qualifier("mpDataExtractAndSaveToYrstStep")
public Step mpDataExtractAndSaveToYrstStep() {
return stepBuilderFactory.get("mpDataExtractAndSaveToYrstStep")
.<VMpHotfilesDailyExtract, MpImport> chunk(Integer.parseInt(100))
.reader(hotFilesReader())
.processor(hotFilesProcessor())
.writer(importDataWriter())
.transactionManager(jpaTransactionManager)
.listener(mpdataExtractStepListener)
.listener(chunkCompletionListener)
.build();
}
@Bean
@StepScope
public RepositoryItemWriter<MpImport> importDataWriter() {
RepositoryItemWriter<MpImport> writer = new RepositoryItemWriter<>();
writer.setRepository(importRepo);
writer.setMethodName("save");
return writer;
}
代码:
@自动连线
私有MpImportRepository importRepo;
@自动连线
JpaTransactionManager JpaTransactionManager;
@自动连线
私有MpImportRepository importRepo;
@豆子
@步进镜
public RepositoryItemReader importDataReader(){
RepositoryItemReader=新的RepositoryItemReader();
reader.setPageSize(100);
reader.setRepository(importRepo);
reader.setMethodName(“FindAllImportAdministringPersons”);
reader.setSort(Collections.singletonMap(“missingDate”、Sort.Direction.ASC));
返回读取器;
}
@豆子
@限定符(“mpDataExtractAndSaveToYrstJob”)
公共作业mpDataExtractAndSaveToYrstJob(){
返回jobBuilderFactory.get(“mpDataExtractAndSaveToYrstJob”)
.incrementer(新的RunIdIncrementer())
.listener(jobCompletionListener)
.flow(mpDataExtractAndSaveToYrstStep())
.end().build();
@豆子
@限定符(“mpDataExtractAndSaveToYrstStep”)
公共步骤mpDataExtractAndSaveToYrstStep(){
返回stepBuilderFactory.get(“mpDataExtractAndSaveToYrstStep”)
.chunk(整数.parseInt(100))
.reader(hotFilesReader())
.processor(hotFilesProcessor())
.writer(importDataWriter())
.transactionManager(jpaTransactionManager)
.listener(mpdataExtractStepListener)
.listener(chunkCompletionListener)
.build();
}
@豆子
@步进镜
public RepositoryItemWriter导入数据编写器(){
RepositoryItemWriter writer=新的RepositoryItemWriter();
writer.setRepository(importRepo);
writer.setMethodName(“保存”);
返回作者;
}
发生这种情况可能是因为您在处理记录时更改了排序键。您是否尝试过不更新时间戳
字段,并查看读卡器是否正确读取了所有记录?是的,我认为在运行时更改用于排序的数据是危险的。是的,我通过不更新时间戳进行了测试,所有操作都很好。So我正在写一个不更新时间戳的解决方案,看看如何进行。谢谢大家的建议/评论。