代码之家  ›  专栏  ›  技术社区  ›  omar

RepositoryItemReader跳过Spring Batch V5中的项目

  •  1
  • omar  · 技术社区  · 3 年前

    问题

    我遇到的问题 RepositoryItemReader 在我的 春季批次 在读取过程中跳过项目的作业。我已配置 RepositoryItemReader 具有特定 分页大小 并将其与 块大小 步骤的。然而,一些项目正在 跳过 ,我无法确定问题的根本原因。

    我读了答案 here 在我写问题之前,但我找不到解决我的问题的办法。

    以下是我的设置的相关详细信息:

    我正在使用 春季批次v5 .

    这个 RepositoryItemReader 正在使用从存储库读取数据 findByIsEnabled 方法

    我已经设置了 pageSize 的值设置为与步骤定义中的块大小相同的值。 我已经验证了没有任何筛选器或条件应用于RepositoryItemReader以排除项目。

    RepositoryItemReader使用的存储库是事务性的,读取器调用的方法在同一事务中执行。 我已经检查了数据源中是否存在任何可能导致跳过的不一致或缺失项目,但一切似乎都正常。

    将近一半的页面被跳过 (4961/1000)项目比率

    enter image description here

    更新:我创建了一个简单的演示应用程序来重现这个问题。你可以在我的GitHub存储库中找到代码: GitHub Repository Link

    顶部的示例使用h2嵌入式数据库,您只需运行它就可以看到结果。

    我怀疑可能存在分页逻辑问题或某些错误配置,导致读者跳过下一页。我已经查看了 Spring Batch文档 并尝试了各种配置,但我无法确定这种行为的根本原因。

    有人能帮我找出这种跳过行为的潜在原因吗 RepositoryItemReader ? 如有任何建议或见解,我们将不胜感激。

    0 回复  |  直到 3 年前
        1
  •  2
  •   Mar-Z    3 年前

    乍一看,代码中的问题在于 ItemProcessor 您正在修改列 enabled 其也用作读取器中的过滤器。这不能用于分页读取器。由于处理器中的更改,每个块都将获得不同的一组或多行。

    解决方案

    不更改列 启用 在处理器中。使用不同的列,如 processed 并且在批处理完成后,运行SQL以更新 启用