在RestTemplate中使用错误处理程序时可以使用@Retry和@Recover吗?

问题描述

我正在使用Rest Template调用rest API。为了处理异常,我使用了自定义的ErrorHandler。

我还使用了@Retry和@Recover。最初在URL中出现ConnectException时,应在第二个URL上进行调用。但是,经过3次尝试,即使我定义了恢复方法,也会抛出ExhaustedRetry“找不到恢复方法”异常。

是因为我正在使用ErroHandler而没有显式引发异常吗?

下面是我的代码的骨架-

@Component
public class TestCall {

@Autowired
private RestTemplate restTemplate;

private boolean flag = false;

@Retryable(value = {ConnectException.class},maxAttempts = 3,backoff = @Backoff(delay = 96,maxDelay = 158,random = true))
public void callAPI() {
    
    restTemplate.setErrorHandler(new RestErrorHandler());

    if (!flag) {
        // calling first URL
        flag = !flag;
        restTemplate.exchange(url1,HttpMethod.POST,body,Response.class);
    } else {
        // retrying with 2nd url if 1st url fails with ConnectException
        flag = !flag;
        restTemplate.exchange(url2,Response.class);
    }
    
}

@Recover
public void recover(ConnectException exception) {
    System.out.println("In recover method");
}}

错误处理程序-

public class RestErrorHandler implements ResponseErrorHandler {

@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
    return false;
}

@Override
public void handleError(ClientHttpResponse response) throws IOException {
    //logging the error here
}
}

重试3次后,如果第4组抛出异常,则不会调用恢复方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)