java использовать httpclient-4.5.6 установить тайм-аут не работает в производственной среде - PullRequest
0 голосов
/ 29 мая 2020

Я использую запросы отправки httpclient для вызова интерфейсов других систем. На самом деле я установил тайм-аут. в тестовой среде. Это нормальная работа. Но в производственной среде не сработало, этот запрос занял 2 минуты. Ниже мой код:

 String url = "https://apitest.i.sinotrans.com:8065/idp/v1/restful/IDPAuthenticate?appId=TEST2019QWWE&remoteIp=0:0:0:0:0:0:0:1";
 JSONObject result = HttpsUtils.doPost(url.toString(),headers)

И код HttpsUtils:

public class HttpsUtils {
    private static PoolingHttpClientConnectionManager connMgr;
    private static RequestConfig requestConfig;
    private static final int MAX_TIMEOUT = 3000;

    private static Logger logger = Logger.getLogger("HttpsUtils.class");
    private static Log log= LogFactory.getLog(HttpsUtils.class);

    static {
        connMgr = new PoolingHttpClientConnectionManager();
        connMgr.setMaxTotal(100);
        connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());
        // Validate connections after 1 sec of inactivity
        connMgr.setValidateAfterInactivity(1000);
        RequestConfig.Builder configBuilder = RequestConfig.custom();
        // set timeout
        configBuilder.setConnectTimeout(MAX_TIMEOUT);
        configBuilder.setSocketTimeout(MAX_TIMEOUT);
        configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);


        requestConfig = configBuilder.build();
    }
    public static JSONObject doPost(String apiUrl,Map<String,String> headers) throws Exception{
        return doPost(apiUrl,new HashMap<>(5),headers);
    }

    /**
     * send post
     *
     * @param apiUrl URL
     * @param params params map
     * @return
     */
    public static JSONObject doPost(String apiUrl, Map<String, Object> params,Map<String,String> headers) throws Exception{
        CloseableHttpClient httpClient = null;
        if (apiUrl.startsWith("https")) {
            httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
        } else {
            httpClient = HttpClients.createDefault();
        }
        String httpStr = null;
        HttpPost httpPost = new HttpPost(apiUrl);
        for(Map.Entry<String, String> entry : headers.entrySet()){
            httpPost.addHeader(entry.getKey(),entry.getValue());
        }
        CloseableHttpResponse response = null;

        try {
            httpPost.setConfig(requestConfig);
            List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());
                pairList.add(pair);
            }
            httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            log.warn("start time:" + sdf.format(new Date()));
            Timer timer  = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println("123");
                    httpPost.abort();
                }
            },5000);
            response = httpClient.execute(httpPost);
            log.warn("end time :" + sdf.format(new Date()));
            HttpEntity entity = response.getEntity();
            httpStr = EntityUtils.toString(entity, "UTF-8");
        } catch (IOException e) {
            logger.log(Level.WARNING," doPost Map error", e);
        } finally {
            if (response != null) {
                try {
                    EntityUtils.consume(response.getEntity());
                } catch (IOException e) {
                    logger.log(Level.WARNING," doPost Map error", e);
                }
            }
        }
        return JSON.parseObject(httpStr);
    }

    private static SSLConnectionSocketFactory createSSLConnSocketFactory() {
        SSLConnectionSocketFactory sslsf = null;
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();
            sslsf = new SSLConnectionSocketFactory(sslContext, new HostnameVerifier() {

                public boolean verify(String arg0, SSLSession arg1) {
                    return true;
                }
            });
        } catch (GeneralSecurityException e) {
            logger.log(Level.WARNING," createSSLConnSocketFactory error", e);
        }
        return sslsf;
    }

}

Я установил три параметра

  • setConnectTimeout setSocketTimeout setConnectionRequestTimeout

И запустите отдельный таймер, чтобы прервать httpPost . Но в производственной среде это все равно не работает! Я могу убедиться, что код согласован. Вы можете мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...