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

我正在尝试使我的服务方法在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不会再次尝试。

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

参考方案

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

Spring MVC中的输入验证 - java

我知道Commons Validator框架是Struts项目在服务器端和客户端验证输入值的事实上的标准。Spring MVC项目是否也是如此?我得到的印象可能不是,大多数Struts书籍和论坛都谈论Commons Validator框架,但是只有少数Spring书籍和论坛可以。在Spring MVC项目中验证输入的最佳实践是什么?干杯! 参考方案 在引入S…

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring MVC Web应用程序检测暴力攻击的最佳方法? - java

Spring 3.0 MVC中是否有专门用于帮助检测Web应用程序的身份验证/登录页面上的蛮力攻击的功能? 参考方案 经过长期验证的实践是,如果身份验证失败,则会引入随机但相当大的延迟。这样,合法用户将立即登录,但攻击者每次尝试将花费500ms-1s,这使整个暴力概念不切实际(将永远存在)。合法用户偶尔失败的登录只会使他们稍有延迟,并且不会引起注意。如果需要…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…

在AbstractTransactionalTestNGSpringContextTests中的hibernate和JdbcTemplate之间共享Spring事务 - java

我正在AbstractTransactionalTestNGSpringContextTests的子类中运行测试,在此我通过部分Spring上下文执行测试。每个测试都在一个事务中运行,该事务在最后回滚以使数据库保持不变。一种测试通过Hibernate写入数据库,而另一种则使用JdbcTemplate从同一数据库读取数据,并且两者共享相同的数据源。我发现通过J…