java - Spring @Retryable 与有状态的 Hibernate 对象

标签 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 的 stateful 属性设置为 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重试用尽时的方法,您可以在其中抛出不同的异常,以便调用者知道应该重试的内容与重试用尽的时间之间的区别。

关于java - Spring @Retryable 与有状态的 Hibernate 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54559143/

相关文章:

java - 连续的 appendReplacement 调用失败

java - 如何在 Java 类中创建一个只能从另一个类访问的方法

java - 为什么下面不自动创建引用对象

java - 在 Hibernate 中,两个实体如何与第三个实体具有多对多的单向关系?

hibernate - Spring Boot 2.2.2.RELEASE 中的集成测试隔离失败(每次 SpringBootTest 后删除表时出错)

java - Hibernate 整数的跨字段验证?

java - 如何使用带有数据库的 Java 从 XML 模式实现往返

java - 创建 bean 时出错 - 注入(inject) Autowiring 依赖项失败

java - Android - 将参数发送到 php 脚本以在查询中使用它

java - 是否可以将 spring.cloud.config.uri 与 docker run 命令一起传递?