标签:
HttpClient 会抛出两种异常:java.io.IOException 和 org.apache.http.HttpException。IOException 在 I/O 失败时(比如 socket 超时、 socket 重置等)抛出。HttpException 在出现 HTTP 错误时抛出。通常来说,IOException 异常不是致命的,是恢复的;HttpException 是致命的,是无法自动恢复的。
默认情况下,HttpClient 会尝试从 I/O 异常中自动恢复。默认的自动恢复机制只限于少数认为是安全的异常。
等幂性:如果一个事务,不管是执行一次还是很多次,得到的结果都是相同,这个事务就是等幂的。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();
标签:
原文地址:http://www.cnblogs.com/huey/p/4520391.html