我试图使服务方法在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不会再次尝试。
有人建议解决这个问题吗?
答案 0 :(得分:0)
使用有状态重试时;调用方必须再次调用该方法以进行下一次重试;国家维持已经进行了多少次尝试。因此,您必须使用try / catch并在循环中调用saveSomething
(使用新的Something
或将id设置为null),直到成功为止-使用@Recover
方法重试已用尽,您可以在其中引发不同的异常,以便调用方知道应重试的内容与重试用尽的时间之间的区别。