我在 Spring Boot 项目中使用 Resilience4J 来调用 REST 客户端,如下所示:
@Retry(name = "customerService")
public Customer getCustomer(String customerNumber) {
restTemplate.exchange("https://customer-service.net", HttpMethod.GET, ..., customerNumber);
}
使用此配置:
resilience4j.retry:
instances:
customerService:
maxAttempts: 3
waitDuration: 10s
retryExceptions:
- org.springframework.web.client.HttpServerErrorException
我的期望是如果restTemplate.exchange()
被调用并且客户服务以 a 响应,则在等待十秒钟后HttpServerErrorException
,该getCustomer()
方法将再调用 3 次。
然而,这种情况并非如此。
永远不会再次调用此方法,并立即抛出异常。
看到示例中包含一个备用方法,我决定添加它,即使我真的不想调用不同的方法,我只想再次调用我的原始方法。
无论如何,我指定了一个后备:
@Retry(name = "customerService", fallback = "customerFb")
public Customer getCustomer(String customerNumber) {
return getCustomer();
}
private Customer customerFb(String customerNumber, HttpServerErrorException ex) {
log.error("Could not retrieve customer... retrying...");
return getCustomer();
}
private Customer getCustomer(String customerNumber) {
return restTemplate.exchange("https://customer-service.net", HttpMethod.GET, ..., customerNumber);
}
现在,我看到正在重试回退方法,但是每次都会抛出 HttpServerErrorException,这意味着消费者将收到一个异常作为对其调用的响应。
我的问题是:
是否需要实施后备方法才能使重试功能起作用?
和
抛出异常是预期的行为吗?难道我做错了什么?在进行所有重试尝试之前,我不希望此服务的调用者收到异常。
谢谢