Httpclient 4.5.2 請求重試機制


重點是HttpRequestRetryHandler.retryRequest()方法

public static String callHttpServer(String contentType,String json, String url) {
        String result = "";
        CloseableHttpClient httpclient = null;
        CloseableHttpResponse response = null;
        try {
            
            HttpClientBuilder httpClientBuilder = HttpClients.custom();
            httpClientBuilder.setRetryHandler(new HttpRequestRetryHandler() {
                @Override
                public boolean retryRequest(IOException arg0, int retryTimes, HttpContext arg2) {
                    if (retryTimes > 3) {
                        return false;
                    }
                    if (arg0 instanceof UnknownHostException || arg0 instanceof ConnectTimeoutException
                            || !(arg0 instanceof SSLException) || arg0 instanceof NoHttpResponseException) {
                        return true;
                    }

                    HttpClientContext clientContext = HttpClientContext.adapt(arg2);
                    HttpRequest request = clientContext.getRequest();
                    boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
                    if (idempotent) {
                        return true;
                    }
                    return false;
                }
            });
            httpclient = httpClientBuilder.build();
            HttpPost httppost = new HttpPost(url);

            httppost.setHeader("Content-Type", contentType);
            httppost.setHeader("Expect", "100-continue");
            httppost.setHeader("Accept-Encoding", "gzip,deflate");
            httppost.setHeader("Connection", "Keep-Alive");
            //如果json 為null,會出現異常
            if (null != json) {
                StringEntity stringEntity = new StringEntity(json, "utf-8");
                stringEntity.setContentEncoding("UTF-8");
                stringEntity.setContentType("application/json");
                httppost.setEntity(stringEntity);
            }

            response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                int status = response.getStatusLine().getStatusCode();
                if ((status >= 200 && status < 300)) {
                    result = EntityUtils.toString(entity);
                } else {
                    result = null;
                    
                }
            }
        } catch (Exception ex) {
            logger.error("call http service error:{}", ex);
            result = null;
            ex.printStackTrace();
        } finally {
            if (null != response) {
                try {
                    response.close();
                } catch (IOException e) {
                    logger.error("call http service response close error:{}", e);
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

 

更多參考: https://blog.csdn.net/zmx729618/article/details/78352879


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM