如何在春季批次中重试所有重试后执行一些代码?

时间:2018-03-26 06:29:48

标签: java spring spring-batch spring-retry

我已将最大重试次数设置为3.我只添加了RemoteAccessException作为可重试的异常。我想要做的是将一些实体的状态更改为错误,并在所有重试耗尽后将它们持久保存到数据库中。所有这些我都是在作家的一步。我已经实现了ItemWriteListener,当RemoteAccessException发生时,它确实转到onWriteError方法,在那里我写了这个状态改变逻辑。但是当我在所有执行完成后检查数据库时,我看到状态根本没有改变。

我的问题是,在这种情况下到底发生了什么?在3次重试之后,整个步骤是否会回滚,因为异常仍然存在,因此数据库中没有任何更改?而且,我确实需要将状态更改为错误。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

我找到了答案。在我的情况下,发生了什么 - 重试3次后抛出RetryExhaustedException。正如Spring Retry文档中所述,在这种情况下,任何封闭的事务都将被回滚。

来自春季文档(https://docs.spring.io/spring-batch/trunk/reference/html/retry.html)-

  

在回调失败后,RetryTemplate必须调用RetryPolicy以请求它更新其状态(将存储在RetryContext中),然后它会询问策略是否可以进行另一次尝试。如果不能进行另一次尝试(例如,达到限制或检测到超时),则策略还负责处理耗尽状态。简单的实现只会抛出RetryExhaustedException,这将导致回滚任何封闭的事务。更复杂的实现可能会尝试采取一些恢复操作,在这种情况下,事务可以保持不变。

对于需要将状态更改为错误的情况,我提出了类似的问题并找到答案 - Is there any way to persist some data in database after an exception occurs in ItemWriter in spring batch?