Spring @Retryable与有状态的休眠对象

时间:2019-02-06 17:18:18

标签: java spring hibernate transactional spring-retry

我试图使服务方法在Springs @Retryable失败时重试。

@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
  //some logic and saving
}

问题是,保存对象对象后出现异常。因此,事务将回滚并再次调用该方法。区别在于,something-object的id不再为null,而是它从Hibernate先前的保存过程中获得的值,因此,在第二次尝试中,Hibernate不会保存该对象,而是尝试对其进行更新。由于数据库中没有条目,因此更新不会执行任何操作,并且该对象也不会固定在数据库中。

认识到这一点后,我尝试将@Retryable的有状态属性设置为true:

@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3, stateful = true)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
  //some logic and saving
}

但是使用该配置,saveSomething()仅被调用一次,而der不会再次尝试。

有人建议解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

使用有状态重试时;调用方必须再次调用该方法以进行下一次重试;国家维持已经进行了多少次尝试。因此,您必须使用try / catch并在循环中调用saveSomething(使用新的Something或将id设置为null),直到成功为止-使用@Recover方法重试已用尽,您可以在其中引发不同的异常,以便调用方知道应重试的内容与重试用尽的时间之间的区别。