Spring @Retryable 有状态 Hibernate 对象

Spring @Retryable with stateful Hibernate Object

我正在尝试使用 Springs @Retryable 使我的服务方法在失败时重试。

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

问题是保存对象后出现异常。于是回滚了Transaction,又调用了Method。不同之处在于 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 就不会再尝试了。

有没有解决这个问题的建议?

当您使用状态重试时;调用者必须再次调用该方法才能进行下一次重试;状态维护已经进行了多少次尝试。因此,您必须使用 try/catch 并在循环中调用 saveSomething(使用新的 Something,或将 id 设置为 null)直到成功 - 使用 @Recover 方法因为当重试耗尽时,您可以在其中抛出不同的异常,以便调用者知道应该重试和重试耗尽时的区别。