【问题标题】:Spring Batch: Duplicate rows after job re-runSpring Batch:作业重新运行后重复行
【发布时间】:2015-03-05 05:34:08
【问题描述】:

我们的 Spring Batch 应用程序在重新启动失败的作业时会再次处理相同的记录,从而导致重复的行,我们想了解如何避免这种情况。

启动批处理作业的 Spring Integration 轮询器配置为每隔几个小时运行一次。第二次运行时,作业参数不变,但如果上一次运行失败(例如,由于 DataTruncation 异常),Spring Batch 不会抱怨作业已经完成。

在故障点,数十万条记录已经被处理并从源表复制到目标表。当该作业随后运行时,相同的行将被复制到目标表中,从而导致重复。因此,该作业似乎没有被恢复,而是从头开始重新启动。

Spring Batch 数据库是 Derby(基于文件),这是在应用程序启动时设置的,并且在实际应用程序的重新启动之间似乎没有保持状态(因为可以使用相同的参数再次运行作业)。但是,在一个应用程序运行中,状态会保持不变。例如,如果作业成功完成,下次轮询器运行时将抛出异常,因为作业(带有这些参数)已经完成。

我们的工作定义如下:

<batch:job id="publisherJob" >
   <batch:step id="step1">
      <batch:tasklet >
    <batch:chunk reader="itemReader" processor="itemProcessor"
              writer="itemWriter" commit-interval="${...}" />
        </batch:tasklet>

        <batch:listeners>
        ...
        </batch:listeners>
</batch:job>

<bean id="itemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
   <property name="dataSource" ref="dataSource" />
   <property name="sql" value="select ${...} from ${...} where ${...}" />
   <property name="rowMapper" ref="rowMapper" />
</bean>

WHERE 子句包括 ORDER BY。

我们的理解是 Spring Batch 将保留处理失败的状态并从该点继续(如果源表中的错误已得到修复),从而防止重复行。要发生这种情况需要进行什么配置?

谢谢

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    Spring Batch 维护状态,因为它记住处理了多少条记录,而不是具体记录哪些记录。正因为如此,由你来保证项目的顺序在运行之间是可重现的,这样如果我们在运行 1 中处理 100 条记录并失败,当我们在运行 2 中跳过前 100 条记录时,那些是正确的 100要跳过的记录。您没有为JdbcCursorItemReader 提供配置,但我的假设是您没有在 SQL 中使用 order by。如果你想要可重启性,你需要一些方法来保证项目的顺序。在 SQL 中使用 order by 是完成此任务的最简单方法(如果需要,还有其他方法,例如使用流程指示器模式)。

    【讨论】:

    • 谢谢。在我们的 JdbcCursorItemReader 中,我们定义了一个 ORDER BY 子句。这就是为什么我们总是在每次重新运行时,将完全相同的行插入到目标表中。被复制的总是同一个集合。因此,Spring Batch 似乎总是从源结果集中的第一行开始。
    • ...
    • 您确定您实际上是在重新启动作业还是只是再次运行它?
    • 如何区分这两者?轮询器正在第二次启动批处理作业。是从 Spring Batch Admin 中重新启动的唯一方法吗?
    • 我必须查看您的作业启动配置,但再次运行作业和重新启动作业之间存在差异。如果您第二次在作业存储库中获得新的JobInstance,则您不会重新启动作业,这意味着状态已重置。作为旁注,您能否删除上面发布配置的 cmets,并指出您更新了问题(以保持此处的内容干净)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多