【发布时间】: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