java - Spring Batch Retry - Spring 是从停止处开始还是从头开始

标签 java spring-batch

下面是我的重试配置:

    <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/

相关文章:

java - RxJava 中的信号边缘过滤

java - 未能捕获异常

不包括 Spring Batch 默认 bean

java - 您可以从 JobParameters 或配置发送 Spring Batch 提交间隔吗?

java - 获取jtextfield的值并将其以另一种形式放入标签

java - Elasticsearch Java API - 如何在不检索文档的情况下获取文档数量

java - ArrayList 和 Vector 有什么区别?

spring-batch - 项目写入期间意外的 rollbackCount 和 shouldSkip() 的调用

java - 当 Tasklet#execute 应该返回 CONTINUABLE 时?

java - 设计一个 Spring 批处理应用程序从不同的资源(平面文件)读取数据