HttpClient(4.3.5) - 异常处理

HttpClient 会抛出两种异常:java.io.IOException 和 org.apache.http.HttpException。IOException 在 I/O 失败时(比如 socket 超时、 socket 重置等)抛出。HttpException 在出现 HTTP 错误时抛出。通常来说,IOException 异常不是致命的,是恢复的;HttpException 是致命的,是无法自动恢复的。

默认情况下,HttpClient 会尝试从 I/O 异常中自动恢复。默认的自动恢复机制只限于少数认为是安全的异常。

  • HttpClient 不会尝试从任何的逻辑错误或者 HTTP 协议错误(HttpException 的子类)中恢复出来。
  • HttpClient 会自动重试等幂的方法,例如 HEAD、GET 方法。
  • HttpClient 会自动重试那些 HTTP 请求还正在传输至目标服务器时抛出传输异常的方法。

等幂性:如果一个事务,不管是执行一次还是很多次,得到的结果都是相同,这个事务就是等幂的。HttpClient 假定没有封装实体的方法为等幂的,比如 HEAD、GET;封装了实体的方法为非等幂的,比如 POST、PUT。

 

异常重试的示例

HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {
    public boolean retryRequest(IOException exception,
            int executionCount, HttpContext context) {
        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 ConnectTimeoutException) {
            // Connection refused
            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;
    }
};
CloseableHttpClient httpclient = HttpClients.custom()
    .setRetryHandler(myRetryHandler)
    .build();

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。