CloseableHttpClient:如果有例外,是否所有异常都会转到retyHandler()?

时间:2019-04-05 18:33:07

标签: java apache-httpclient-4.x closeablehttpresponse

因此,我正在为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()?

1 个答案:

答案 0 :(得分:1)

  1. 异常逻辑由HttpClient在请求执行管道内实现。 HttpRequestRetryHandler只是用于确定是否将重新执行失败请求的决策策略。我承认HttpRequestRetryHandler可能是用词不当。它实际上不是处理程序。

  2. 仅将I / O异常视为可恢复的。运行时异常会传播到调用方。