有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Springbean基类中定义的方法中使用@Retryable的java不会被重试

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

但是,我真正想重试的方法是在基类中定义的方法,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();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    @Retryable是使用Spring AOP实现的

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

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