我正在尝试使用重试https://www.mscharhag.com/spring/spring-retry,但面临一个问题。我有一个方法
public String methodA( T Object) {
try{
}catch(someException sme){
return fixit(Object);
}
}
@Retryable(value = {someException.class}, maxAttempts = 3)
public String fixit( T Object) {
return x;
}
如果抛出相同的异常,我需要尝试fixit 3次。但不知何故,retryable不适用于我从异常块调用的方法。
什么指针丢失了?如果我在方法A之上添加注释,它可以工作,但这不是我想要的行为。我尝试了@Recover,但是只有在尝试了maxAttempts之后才会调用它,而不是每次都遇到异常。
答案 0 :(得分:1)
我假设@Retryable
正在使用AOP拦截器和Java代理。
您面临的问题是您正在同一个类中调用方法,因此AOP代理不会涉及。这就是为什么当您将注释移动到方法methodA
时,您的代码开始按预期工作的原因(因为我假设该方法从另一个类调用)。
您可以做的是将方法fixit
移动到另一个Spring bean并使用methodA
将其注入Spring bean
@Component
class ClassWithMethodA {
@Autowired
private AnotherBean bean;
public String methodA( T o) {
try{
}catch(someException sme){
return bean.fixit(o);
}
}
}
@Component
class AnotherBean {
@Retryable(value = {someException.class}, maxAttempts = 3)
public String fixit( T o) {
return x;
}
}