【问题标题】:Spring Batch ItemReader skips the first record on the second pageSpring Batch ItemReader 跳过第二页的第一条记录
【发布时间】:2021-08-12 00:30:36
【问题描述】:

我有这个 ItemReader:

@Bean
public JpaPagingItemReader<GWBillingDetails> itemReaderUpdPCJPA() {

        JpaPagingItemReader<GWBillingDetails> reader = new JpaPagingItemReader();
        reader.setName("jpaPagingUpdPCReader");
        reader.setEntityManagerFactory(entityManagerFactory.unwrap(SessionFactory.class));
        reader.setPageSize(10);
        reader.setQueryString("Select pc from GWPaymentClaim pc INNER JOIN GWTransazioni tr ON tr.id = pc.id.idTransazione WHERE pc.kbStatus = 'SENT' AND tr.status = 'P'");
        reader.setSaveState(true);
        return reader;
}

在它的 ItemProcessor 中,我有一些细化逻辑,在特定条件下,它可以对 DB 中的实体进行更新。 假设我们有21条记录被ItemReader读取(那么它们被ItemReader分成3页)并且第一页只有一条记录满足这个条件(所以这条记录被更新),ItemReader莫名其妙地跳过了第二页的第一条记录。 相反,如果记录是两条,则项目阅读器会跳过第二页上的前两条记录,等等...。

谁能告诉我为什么?

【问题讨论】:

标签: java spring spring-boot spring-data-jpa spring-batch


【解决方案1】:

当 Spring Batch 按顺序处理块时,它会为单个块执行从读取器到写入器的所有操作,然后继续处理下一个块。这意味着写入器将在读取器处理第二个块之前处理第一个块。

如果 writer 以某种方式更改 reader 的输入表,即在 reader 的查询结果中添加或删除条目,则分页将无法开箱即用,因为在 reader 处理时 limit 和 offset 已过时第二块。

您缺少第 11 项,即第二个块的第 1 项,因为更新更改了 10 项中的一项,因此它们不再包含在结果集中。然后,之前的第 12 项变为第 11 项。

尝试重写查询,以便更新不会更改结果集。如果你需要过滤,你可以例如使用 ItemProcessor 将不应更改的项目映射到 null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多