本人在使用httpclient作接口測試的過程當中,以前並無考慮到請求失敗自動重試的狀況,但有時又須要在發生某些錯誤的時候重試,好比超時,好比響應頻繁被拒絕等等,在看過官方的示例後,本身寫了一個自動重試的控制器。分享代碼,供你們參考。java
下面是獲取控制器的方法:編程
/** * 獲取重試控制器 * * @return */ private static HttpRequestRetryHandler getHttpRequestRetryHandler() { return new HttpRequestRetryHandler() { public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { logger.warn("請求發生錯誤!", exception); if (executionCount > HttpClientConstant.TRY_TIMES) return false; if (exception instanceof NoHttpResponseException) { logger.warn("沒有響應異常"); sleep(1); return true; } else if (exception instanceof ConnectTimeoutException) { logger.warn("鏈接超時,重試"); sleep(5); return true; } else if (exception instanceof SSLHandshakeException) { logger.warn("本地證書異常"); return false; } else if (exception instanceof InterruptedIOException) { logger.warn("IO中斷異常"); sleep(1); return true; } else if (exception instanceof UnknownHostException) { logger.warn("找不到服務器異常"); return false; } else if (exception instanceof SSLException) { logger.warn("SSL異常"); return false; } else if (exception instanceof HttpHostConnectException) { logger.warn("主機鏈接異常"); return false; } else if (exception instanceof SocketException) { logger.warn("socket異常"); return false; } else { logger.warn("未記錄的請求異常:{}", exception.getClass()); } HttpClientContext clientContext = HttpClientContext.adapt(context); HttpRequest request = clientContext.getRequest(); // 若是請求是冪等的,則重試 if (!(request instanceof HttpEntityEnclosingRequest)) { sleep(2); return true; } return false; } }; }
這樣超時時間和重試次數來做爲判斷接口請求失敗的依據了。下面是控制器設置方法:服務器
/** * 經過鏈接池獲取https協議請求對象 * <p> * 增長默認的請求控制器,和請求配置,鏈接控制器,取消了cookiestore,單獨解析響應set-cookie和發送請求的header,適配多用戶同時在線的狀況 * </p> * * @return */ private static CloseableHttpClient getCloseableHttpsClients() { // 建立自定義的httpsclient對象 CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).setRetryHandler(httpRequestRetryHandler).setDefaultRequestConfig(requestConfig).build(); // CloseableHttpClient client = HttpClients.createDefault();//非鏈接池建立 return client; }