1、问题
由于调用的服务在出错时正常返回,返回的数据里包含Server Error,并没有包含其他有效信息,导致OkHttp 认为结果正常,拦截器里不能自动进行重试,因此需要自己写重试逻辑。
2、递归重试
@Test
public void retryRecursion() {
//重试5次
String result = retryRecursion(5);
System.out.println(result);
}
private static String retryRecursion(int times) {
try {
String result = okHttpClientUtils.doPost(url, request);
if (result.contains("Server Error")) {
throw new IOException(result);
}
return result;
} catch (Exception e) {
//重试次数到了
if (--times <= 0) {
logger.error("服务出错, url: {}, request: {}, error: {}", url, request, e);
return "";
}
//休眠一会
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e1) {
}
//重试
return retryRecursion(times);
}
}
3、while 重试
@Test
public void retryWhile() {
//重试5次
String result = retryWhile(5);
System.out.println(result);
}
private String retryWhile(int times) {
String result = "";
boolean first = true;
while (first || (times > 0 && StringUtils.isBlank(result))) {
first = false;
try {
result = okHttpClientUtils.doPost(url, request);
if (result.contains("Server Error")) {
throw new IOException(result);
}
return result;
} catch (Exception e) {
//重试次数到了
if (--times <= 0) {
logger.error("服务出错, url: {}, request: {}, error: {}", url, request, e);
return "";
}
//休眠一会
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e1) {
}
}
}
return result;
}