下面是我的重试配置:
<batch:job id="myLookUpLoadJob">
<batch:step id="myLookUpTruncateStep">
<batch:tasklet ref="myLookupTruncateTasklet" />
<batch:next on="*" to="myLookUpLoadStep"/>
</batch:step>
<batch:step id="myLookUpLoadStep">
<batch:tasklet>
<batch:chunk reader="myLookupItemReader"
writer="myLookupItemWriter" commit-interval="100" retry-limit="2">
<retryable-exception-classes>
<include class=" org.springframework.dao.DataAccessResourceFailureException"/>
</retryable-exception-classes>
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
以下是我无法从 Spring 文档中得到答案的问题 - 希望您能提供意见:
当处理200行后发生异常时,重试是从第201行开始还是从第1行开始?
编辑
我试图解决的问题是,当作业运行时,在提交第一个 block (100 行)之后,与 ItemReader 的连接立即终止(重置)。然后该作业将重新启动并成功完成。
我想知道这是否有帮助:
来自 AbstractCursorItemReader
有一个选项 (setUseSharedExtendedConnection(boolean)),它将与步骤处理的其余部分共享用于游标的连接。如果将此标志设置为 true,则必须将 DataSource 包装在 ExtendedConnectionDataSourceProxy 中以防止作为步骤处理的一部分执行每次提交后,连接不会被关闭和释放。您还必须使用支持 JDBC 3.0 或更高版本的 JDBC 驱动程序,因为游标将在启用“HOLD_CURSORS_OVER_COMMIT”附加选项的情况下打开。
最佳答案
这取决于您的读者。 ItemReader
实现负责通过 ItemStream
接口(interface)回调在 ExecutionContext
中保留自己的状态。如果 ItemReader
通过 ItemStream#update
方法保持其状态(在本例中我假设的行号),并且如果 ItemReader
恢复通过 ItemSteam#open
回调方法进入该状态,然后我希望它在正确的行重新启动。 Spring 提供的所有 ItemReader
实现都在有意义的情况下利用了此功能。我只是无法判断您是否会这样做,因为我对您的配置中的 myLookupItemReader
没有任何了解。
关于java - Spring Batch Retry - Spring 是从停止处开始还是从头开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39595566/