我有下面的代码,如果我在控制器方法上保留retry注释,那么它将被重试,但是如果我将retry注释保留在另一个方法上,它就不会重试。场景是,在API方法createOrder()中,我从一个运行良好的外部系统中获取orderId。但是我需要重新尝试createOrder(String orderId)方法,它有时会失败。
@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);
}resilience4j.retry:
instances:
orderService:
maxRetryAttempts: 3
waitDuration: 11000发布于 2022-11-16 05:59:56
这是因为代理。当用@Retry注释时,创建并使用该类的代理实例。代理的工作方式是拦截从一个bean/类到另一个bean/类的调用,并且它不能拦截bean/class中的方法和方法之间的调用。
因此,解决办法是将方法移动到不同的类。一旦方法被移动到不同的类中,spring代理就会考虑来自一个单独bean的调用,并且它可以拦截。
https://stackoverflow.com/questions/71749613
复制相似问题