3

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

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

我真的希望 doSomethingElse 被重试,基类方法。但是,我不确定如何执行此操作。我猜这是因为 A 是一个具体的类而不是一个 bean,尽管它确实是一个基类。

我需要在 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();
    }
}
4

1 回答 1

19

@Retryable使用Spring AOP实现。

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

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

于 2017-01-25T16:02:42.593 回答