spring - Spring Batch - MongoItemReader 未读取所有记录
问题描述
我创建了一个 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();
}
解决方案
这MongoItemReader
是一个分页项目阅读器。当读取页面中的项目并更改查询可能返回的项目(即在查询的“where”子句中使用的字段)时,分页逻辑可能会丢失并且可能会跳过某些项目。JPA 分页项目阅读器存在类似问题,此处详细说明:Spring batch jpaPagingItemReader 为什么不读取某些行?
解决此问题的常用技术是使用基于游标的读取器、使用临时表/集合、使用分区步骤和每页分区等。
推荐阅读
- java - 在选项卡式活动中打开新片段时播放声音
- javascript - Node.js 可以在不同的页面上触发点击事件吗?
- c# - C# 检查一个列表
在列表框中选择项目,如果是,则返回 true - python - 在 Raspberry Pi 上导入熊猫时出错
- python - 从 Python 上的多个文件创建加密的 Zip 文件
- javascript - reduce() 方法从对象数组返回 NaN
- ios - Swift 发送请求失败,但 Postman 成功
- php - PHP MySQL:如何从图像表中检索与项目 ID 关联的所有图像
- clang++ - clang++-5.0 找不到头文件
- swift - 如何在 Swift / MacOS 中将菜单项添加到顶部导航栏