【问题标题】:Is there a way to prevent batch from double processing of the same chunk/item when an skip occurs?发生跳过时,有没有办法防止批处理对同一块/项目进行双重处理?
【发布时间】:2016-06-22 17:56:37
【问题描述】:

在我的特定场景中,我必须将从文件读取的大量实体持久保存到数据库中,但我的提交间隔配置为 value = 1。此外,我不太确定使用的CompositeItemProcessor 中的委托处理器是否是幂等的。所以我的问题是,是否有办法防止浪费时间重新处理并避免对数据库进行许多未使用的查询。我还想使用 SkipListener 将读取/处理/写入的错误记录到特定表中,并怀疑此类配置(无重新处理)不符合此要求。

我正在使用 Spring Batch 2.1.9。

提前致谢。

____________________________2016 年 7 月 5 日更新 ____________________________

经过几天的研究,我意识到一些用户和 Spring 开发人员之间存在概念上的争论。

我现在知道,正如@MichaelMinella 在此2014 post 答案的评论中所说,这种行为是在编写阶段抛出的跳过异常上设计的:

ItemWriter#write 方法接收项目列表。不用去 通过它们一次一个,我们无法确定哪个 列表中的异常在 writer 中抛出。

所以框架还没有办法在不扫描整个列表的情况下发现失败的项目(即使块大小为 1)。执行此操作的框架的内部行为使用FaultTolerantChunkProcessor 和RetryTemplate 在this 2013 post 中进行了描述,有关此问题的更多讨论可以在此spring batch forum 2012 post 上找到。

【问题讨论】:

    标签: transactions spring-batch skip spring-retry


    【解决方案1】:

    如果您的块大小等于 1,则不应多次处理该项目。当发生跳过时,spring batch 会删除块中跳过的项目并重新处理它。当块只包含一个元素时,不应该有多次处理的元素。

    【讨论】:

    • 我也预料到了这种行为@joshiste,但实际上框架总是重新处理缓存在读取中的列表并处理每个项目的小块以知道哪个项目对错误负责,即使此列表仅包含一个元素。我想知道的是如何覆盖此行为或配置批处理以跳过此昂贵的重试。如果我也想使用 SkipCheckListener 来注册处理错误,这可能是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多