zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    手打AC的第2道数位DP:BZOJ1799: [Ahoi2009]self 同类分布
    Oracle PL/SQL编程基础
    Oracle高级查询,事物,过程及函数
    缓存技术
    图形化报表
    网站配置与部署
    Oracle 空间管理
    Oracle 10g体系结构及安全管理
    ORACLE 数据库概述
    jQuery中的Ajax应用
  • 原文地址:https://www.cnblogs.com/gczmn/p/11995674.html
Copyright © 2011-2022 走看看