Phi*_*ger 5 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
}
Run Code Online (Sandbox Code Playgroud)
问题是,在保存某物对象后出现异常。所以事务被回滚并再次调用方法。不同之处在于,something-object 的 id 不再是 null,而是它从 Hibernate 之前的保存过程中获得的值,因此在第二次尝试中,Hibernate 不会保存该对象,而是尝试更新它。由于数据库中没有条目,因此更新不执行任何操作,并且对象不会持久保存到数据库中。
认识到这一点后,我尝试将 @Retryable 的 stateful 属性设置为 true:
@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3, stateful = true)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
//some logic and saving
}
Run Code Online (Sandbox Code Playgroud)
但是使用该配置 saveSomething() 只调用一次,而 der 不是第二次尝试。
有没有人建议解决这个问题?
当您使用有状态重试时;调用者必须再次调用该方法才能进行下一次重试;国家保留已进行的尝试次数。因此,您必须使用 try/catch 并saveSomething在循环中调用(使用 new Something,或将 id 设置为 null),直到成功为止 - 使用@Recover重试次数耗尽时的方法,您可以在其中抛出不同的异常,以便调用者知道应该重试的事情和重试次数耗尽之间的区别。
| 归档时间: |
|
| 查看次数: |
1358 次 |
| 最近记录: |