首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Resilience4j重试不重试

Resilience4j重试不重试
EN

Stack Overflow用户
提问于 2022-04-05 09:49:54
回答 1查看 506关注 0票数 1

我有下面的代码,如果我在控制器方法上保留retry注释,那么它将被重试,但是如果我将retry注释保留在另一个方法上,它就不会重试。场景是,在API方法createOrder()中,我从一个运行良好的外部系统中获取orderId。但是我需要重新尝试createOrder(String orderId)方法,它有时会失败。

代码语言:javascript
复制
@GetMapping("/order")
//@Retry(name = ORDERSERVICE, fallbackMethod = "fallback_retry")
public ResponseEntity<String> createOrder() {
        int orderId = 1; // makeDBCall or fetch it from somewhere
        return createOrder(orderId); // need to retry this method in case it fails
    }

@Retry(name = ORDERSERVICE, fallbackMethod = "fallback_retry")
public ResponseEntity<String> createOrder(int orderId) {
    logger.info("item service call attempted:::" + attempts++);
    String response = restTemplate.getForObject("http://localhost:8081/item/" + orderId, String.class);
    logger.info("item service called");
    return new ResponseEntity<String>(response, HttpStatus.OK);
}
代码语言:javascript
复制
resilience4j.retry:
  instances:
    orderService:
      maxRetryAttempts: 3
      waitDuration: 11000
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-16 05:59:56

这是因为代理。当用@Retry注释时,创建并使用该类的代理实例。代理的工作方式是拦截从一个bean/类到另一个bean/类的调用,并且它不能拦截bean/class中的方法和方法之间的调用。

因此,解决办法是将方法移动到不同的类。一旦方法被移动到不同的类中,spring代理就会考虑来自一个单独bean的调用,并且它可以拦截。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71749613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档