Spring Batch - MongoItemReader 未读取所有记录
Posted
技术标签:
【中文标题】Spring Batch - MongoItemReader 未读取所有记录【英文标题】:Spring Batch - MongoItemReader not reading all records 【发布时间】:2021-07-10 16:05:50 【问题描述】:我创建了一个 Spring Batch 作业,它从 MongoDB 读取订单并进行休息调用以上传它们。但是,即使 MongoItemReader 未读取所有记录,批处理作业也会自动完成。
我在 Orders 集合上维护一个字段 batchProcessed:boolean。 MongoItemReader 读取 batchProcessed:$ne:true 的记录,因为我需要多次运行批处理作业,但不会一次又一次地处理相同的文档。
在我的 OrderWriter 中,我将 batchProcessed 设置为 true。
@Bean
@StepScope
public MongoItemReader<Order> orderReader()
MongoItemReader<Order> reader = new MongoItemReader<>();
reader.setTemplate(mongoTempate);
HashMap<String,Sort.Direction> sortMap = new HashMap<>();
sortMap.put("_id",Direction.ASC);
reader.setSort(sortMap);
reader.setTargetType(Order.class);
reader.setQuery("batchProcessed:$ne:true");
return reader;
@Bean
public Step uploadOrdersStep(OrderItemProcessor processor)
return stepBuilderFactory.get("step1").<Order, Order>chunk(1)
.reader(orderReader()).processor(processor).writer(orderWriter).build();
@Bean
public Job orderUploadBatchJob(JobBuilderFactory factory, OrderItemProcessor processor)
return factory.get("uploadOrder").flow(uploadOrdersStep(processor)).end().build();
【问题讨论】:
【参考方案1】:MongoItemReader
是一个分页项目阅读器。当读取页面中的项目并更改查询可能返回的项目(即在查询的“where”子句中使用的字段)时,分页逻辑可能会丢失并且可能会跳过某些项目。 JPA 分页项阅读器存在类似问题,此处详细说明:Spring batch jpaPagingItemReader why some rows are not read?
解决此问题的常用技术是使用基于游标的读取器、使用临时表/集合、使用每页分区的分区步骤等。
【讨论】:
谢谢@Mahmoud,我是一个探索游标的读者。 这里缺少什么来接受答案?我相信它通过指向详细线程的链接回答了您的问题,因此请接受它:***.com/help/someone-answers。否则让我知道缺少什么。谢谢。以上是关于Spring Batch - MongoItemReader 未读取所有记录的主要内容,如果未能解决你的问题,请参考以下文章
Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?
spring batch ftp 集成超时错误 - 使用 spring-boot/spring-batch 进行 ETL
陪你解读Spring Batch带你入手Spring Batch
Spring boot spring.batch.job.enabled=false 无法识别