Spring MongoItemReader没有读取单次执行的所有记录

时间:2017-08-10 05:21:54

标签: mongodb spring-batch

@Bean
public Job orderJob() throws Exception {
    return jobBuilderFactory.get("orderJob").incrementer(new RunIdIncrementer()).listener(listener())
            .flow(orderStep()).end().build();
}

@Bean
public Step orderStep() throws Exception {
    return stepBuilderFactory.get("orderStep").<OrderCollection, Order>chunk(1000)
            .reader(orderReader()).processor(orderProcessor()).writer(orderWriter())
            .allowStartIfComplete(true).build();

}
@Bean
@StepScope
public MongoItemReader<OrderCollection> orderReader() throws Exception {
    MongoItemReader<OrderCollection> reader = new MongoItemReader<>();
    reader.setTemplate(mongoTemplate);
    reader.setCollection("order");
    Map<String, Sort.Direction> sort = new HashMap<>();
    sort.put("_id", Sort.Direction.ASC);
    reader.setSort(sort);
    reader.setTargetType(OrderCollection.class);
    reader.setQuery("{$or: [ {flag:false}, {flag:null} ]}");
    return reader;
}
@Bean
@StepScope
public OrderProcessor orderProcessor() {
    return new OrderProcessor();
}

@Bean
@StepScope
public ItemWriter<Order> orderWriter() {
    return new OrderWriter();
}

订单收集中有5686条记录,所有记录中的标记为false。但读取器在首次运行时只读取和处理3000条记录。第二次运行中有1686条记录,第三次运行中有1000条记录。没有错误FYI

1 个答案:

答案 0 :(得分:2)

我猜你可能正在更新你的阅读集合,并且你还要更新查询正在使用的字段。如果是这样,那么我最近遇到了同样的问题。

MongoItemReader是一个分页阅读器。因此,每次编写器更新这些记录时,阅读器都有一个较小的池,但页面仍在增加。

想象一下,我们有20个项目,一次读5个项目:

1)从总共20个读取项目1-5。

2)更新第1-5项,现在共有15个可能的项目

3)从总共15个中读取项目6-10。

4)更新第6-10项,现在总共有10个可能的项目。

5)阅读10个可能项目的第11-15项

6)Read返回null,因为该页面没有返回任何内容。

所以现在你只处理了一半。

我按照下面的教程创建了一个MongoDbCursorItemReader,它为我解决了这个问题: https://blog.zenika.com/2012/05/23/spring-batch-and-mongodb-cursor-based-item-reader/