因此,我正在为retryHandler()使用此示例,它具有try / finally。我的问题是:如何重试异常?
public class HttpClientRetryHandlerExample {
public static void main(String... args) throws IOException {
CloseableHttpClient httpclient = HttpClients.custom()
.setRetryHandler(retryHandler())
.build();
try {
HttpGet httpget = new HttpGet("http://localhost:1234");
System.out.println("Executing request " + httpget.getRequestLine());
httpclient.execute(httpget);
System.out.println("----------------------------------------");
System.out.println("Request finished");
} finally {
httpclient.close();
}
}
private static HttpRequestRetryHandler retryHandler(){
return (exception, executionCount, context) -> {
System.out.println("try request: " + executionCount);
if (executionCount >= 5) {
// Do not retry if over max retry count
return false;
}
if (exception instanceof InterruptedIOException) {
// Timeout
return false;
}
if (exception instanceof UnknownHostException) {
// Unknown host
return false;
}
if (exception instanceof SSLException) {
// SSL handshake exception
return false;
}
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
if (idempotent) {
// Retry if the request is considered idempotent
return true;
}
return false;
};
}
}
问题是,为什么该示例只进行了try / finally而没有catch?这是否意味着所有异常都将进入retryHandler()?
答案 0 :(得分:1)
异常逻辑由HttpClient在请求执行管道内实现。 HttpRequestRetryHandler
只是用于确定是否将重新执行失败请求的决策策略。我承认HttpRequestRetryHandler
可能是用词不当。它实际上不是处理程序。
仅将I / O异常视为可恢复的。运行时异常会传播到调用方。