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