@Retry fallbackMethod未注册

时间:2019-12-13 13:19:00

标签: java spring-boot resilience4j

我想在我们的Spring Boot 2.2.1.RELEASE项目中使用 resilience4j-spring-boot2 ,以针对第三方服务重试失败的请求。但是,由于某些原因,我无法注册fallbackMethod:

pom.xml(相关依赖项):

<!-- Resilience4J and dependencies -->
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

application.yaml:

resilience4j.retry:
  instances:
    exponentialBackoffBehaviour:
      maxRetryAttempts: 6
      waitDuration: 1s
      enableExponentialBackoff: true
      exponentialBackoffMultiplier: 2

我的Java代码:

@Retry(name = "exponentialBackoffBehaviour", fallbackMethod = "retryfallback")
private List<Applicant> requestApplicantList(HttpHeaders headers) throws JsonProcessingException {
    // This always returns 500 because is mocked
    ResponseEntity<String> response = restTemplate.exchange(URL, HttpMethod.GET, new HttpEntity(headers), String.class); 
    return objectMapper.readValue(response.getBody(), new TypeReference<List<Applicant>>() {});
}

private List<Applicant> retryfallback(HttpHeaders headers, Throwable e) {
    System.out.println("retryfallback");
    return new ArrayList<>();
}

“ retryfallback”从不打印在控制台中。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

注释仅适用于公共方法,不适用于私有方法。

由于Spring的AOP框架基于代理的性质,因此私有方法在定义上不会被拦截。对于JDK代理,只能拦截代理上的公共接口方法调用。使用CGLIB,将拦截代理上的公共方法和受保护的方法调用(必要时甚至包括程序包可见的方法)。但是,通常应通过公开签名设计通过代理进行的常见交互。