【问题标题】:resilience4j annotations not working on chlid class弹性4j注释不适用于chlid类
【发布时间】:2020-04-23 12:46:29
【问题描述】:

我正在将弹性 4j 与 SpringBoot 一起使用。我看到resilience4j 注释只有在它们被放置在抛出异常的类中时才起作用。如果该类被另一个类扩展并且父类具有注释,则重试不起作用。

Resilience4j 配置

resilience4j.retry: 
  instances:       
    service: 
      maxRetryAttempts: 5
      waitDuration: 1000
      retryException: 
        - com.common.exception.RetriableException

父类

@Retry(name = "service")
@Component
public class httpClient extends client{

  // This method is invoked from outside
  public HttpResponse<T> getResponse(
      String url, Class<T> responseType) {
    return super.getResponse(url, requestEntity, responseType);
  }
}

儿童班

@Retry(name = "service") // Without this line, the retries don't work, even though it is present in the parent class
@Component
public class client{

  public HttpResponse<T> getResponse(
      String url, Class<T> responseType) {
    //Impl which throws RetriableException
  }
}

这是预期的行为吗?如果我遗漏了什么,你能告诉我吗

【问题讨论】:

    标签: spring-boot aop resilience4j


    【解决方案1】:

    我以前从未使用过 Resilience4j,但我可以告诉你的关于 Java 注释的一般情况是:

    • 子类中的重写方法从不继承原始父类方法的注释。
    • 在实现接口的类中,实现方法从不从相应的接口方法继承注释。
    • 实现接口的类从不从接口本身继承注释。
    • 扩展另一个接口的接口也从不继承任何类型或方法级别的注释。
    • 默认情况下,甚至子类都不会从其父类继承注释。
    • “注解永远不会被继承”规则有一个例外:类型级别注解(类似于@Foo class Base,也可以是抽象的)可以由子类继承(类似于class Sub extends Base当且仅当注释类本身带有元注释@Inherited

    话虽如此并查看@Retry 注释,您会注意到那里没有@Inherited 注释,因此它也不适用于您的情况。

    如果有其他方式(例如通过反射)在 Resilience4j 中完成此操作,我不知道,因为正如我所说,我以前从未使用过它。

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2021-06-03
      相关资源
      最近更新 更多