Spring 批处理 - MongoItemReader 未读取所有记录

Spring Batch - MongoItemReader not reading all records

我创建了一个 Spring 批处理作业,它从 MongoDB 读取订单并进行休息调用以上传它们。但是,即使 MongoItemReader 未读取所有记录,批处理作业也会自动完成。

我在订单集合上维护一个字段 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();
}

MongoItemReader 是分页项目 reader。当读取页面中的项目并更改可能由查询返回的项目(即在查询的“where”子句中使用的字段)时,分页逻辑可能会丢失并且某些项目可能会被跳过。 JPA 分页项 reader 也存在类似问题,详细说明如下:Spring batch jpaPagingItemReader why some rows are not read?

解决此问题的常用技术是使用基于游标的 reader、使用分段 table/collection、使用每页一个分区的分区步骤等。