Spring重试异常块的问题

时间:2017-11-30 15:05:25

标签: java spring spring-retry

我正在尝试使用重试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之后才会调用它,而不是每次都遇到异常。

1 个答案:

答案 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;
  }
}