在 spring bean 的基础 class 中定义的方法中使用 @Retryable 不会重试

Using @Retryable in methods define in spring bean's base class are not retried

我有一个 spring 类型 B 的托管 bean。我在 @Configuration class 中有 @EnableREtry。当我在 doStuff() 上使用 @Retryable 时,该方法会按预期在失败时重试。

但是,我真正想重试的方法是在基础 class 中定义的方法,A。A 是一个具体的 class 而不是 spring 托管 bean。 doSomethingElse 方法在抛出异常时不会重试。

我真的很想重试 doSomethingElse,基础 class 方法。但是,我不确定该怎么做。我猜这是因为 A 是一个具体的 class 而不是一个 bean,尽管它确实作为基础 class.

我需要在 class A 中使用 RetryableTemplate 吗?

public class B extends A {

   public void doStuff() {
      super.doSomethingElse();
   }
}

public class A {
     // doesn't actually retry
    @Retryable
    public void doSomething() {
      throws new Exception();
    }
}

@Retryable 是使用 Spring AOP.

实现的

只有对可重试方法的外部调用通过代理(它在 RetryTemplate 中调用方法); class 中的内部调用会绕过代理,因此不会重试。

您可以使用一些技巧从应用程序上下文中获取对代理的引用并调用它,或者直接在您的 doStuff() 方法中使用 RetryTemplate