This is an automated email from the ASF dual-hosted git repository.

journey pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new e026d30  Optimize the httpclient (#3337)
e026d30 is described below

commit e026d303eab424a61f9e11ab7e8a306ad027092d
Author: felix.wang <[email protected]>
AuthorDate: Wed Jul 29 19:03:44 2020 +0800

    Optimize the httpclient (#3337)
---
 .../dolphinscheduler/common/utils/HttpUtils.java   | 103 +++++++++++++++++----
 .../common/utils/HttpUtilsTest.java                |   8 ++
 2 files changed, 94 insertions(+), 17 deletions(-)

diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/HttpUtils.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/HttpUtils.java
index 98d9cf1..246aba1 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/HttpUtils.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/HttpUtils.java
@@ -18,41 +18,116 @@ package org.apache.dolphinscheduler.common.utils;
 
 import org.apache.dolphinscheduler.common.Constants;
 import org.apache.http.HttpEntity;
+import org.apache.http.client.config.AuthSchemes;
+import org.apache.http.client.config.CookieSpecs;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
 import java.io.IOException;
-
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
 /**
  * http utils
  */
 public class HttpUtils {
-       
-       
+
+
        public static final Logger logger = 
LoggerFactory.getLogger(HttpUtils.class);
 
+
+       private static CloseableHttpClient httpClient;
+
+       private HttpUtils() {
+
+       }
+
+       private static PoolingHttpClientConnectionManager cm;
+
+       private static SSLContext ctx = null;
+
+       private static SSLConnectionSocketFactory socketFactory;
+
+       private static RequestConfig requestConfig;
+
+       private static Registry<ConnectionSocketFactory> socketFactoryRegistry;
+
+       private static X509TrustManager xtm = new X509TrustManager() {
+               @Override
+               public void checkClientTrusted(X509Certificate[] chain, String 
authType) {
+               }
+
+               @Override
+               public void checkServerTrusted(X509Certificate[] chain, String 
authType) {
+               }
+
+               @Override
+               public X509Certificate[] getAcceptedIssuers() {
+                       return null;
+               }
+       };
+
+       static {
+               try {
+                       ctx = 
SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
+                       ctx.init(null, new TrustManager[] { xtm }, null);
+               } catch (NoSuchAlgorithmException e) {
+                       logger.error("SSLContext init with 
NoSuchAlgorithmException", e);
+               } catch (KeyManagementException e) {
+                       logger.error("SSLContext init with 
KeyManagementException", e);
+               }
+               socketFactory = new SSLConnectionSocketFactory(ctx, 
NoopHostnameVerifier.INSTANCE);
+               /** set timeout、request time、socket timeout */
+               requestConfig = 
RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES)
+                               .setExpectContinueEnabled(Boolean.TRUE)
+                               
.setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, 
AuthSchemes.DIGEST))
+                               
.setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
+                               
.setConnectTimeout(Constants.HTTP_CONNECT_TIMEOUT).setSocketTimeout(Constants.SOCKET_TIMEOUT)
+                               
.setConnectionRequestTimeout(Constants.HTTP_CONNECTION_REQUEST_TIMEOUT).setRedirectsEnabled(true)
+                               .build();
+               socketFactoryRegistry = 
RegistryBuilder.<ConnectionSocketFactory>create()
+                               .register("http", 
PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build();
+               cm = new 
PoolingHttpClientConnectionManager(socketFactoryRegistry);
+               cm.setDefaultMaxPerRoute(60);
+               cm.setMaxTotal(100);
+
+       }
+
+
+       public static synchronized CloseableHttpClient getHttpClient() {
+               if (null == httpClient) {
+                       httpClient = 
HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(requestConfig).build();
+                       ;
+               }
+               return httpClient;
+       }
        /**
         * get http request content
         * @param url url
         * @return http get request response content
         */
        public static String get(String url){
-               CloseableHttpClient httpclient = HttpClients.createDefault();
+               CloseableHttpClient httpclient = HttpUtils.getHttpClient();
 
                HttpGet httpget = new HttpGet(url);
-               /** set timeout、request time、socket timeout */
-               RequestConfig requestConfig = 
RequestConfig.custom().setConnectTimeout(Constants.HTTP_CONNECT_TIMEOUT)
-                               
.setConnectionRequestTimeout(Constants.HTTP_CONNECTION_REQUEST_TIMEOUT)
-                               .setSocketTimeout(Constants.SOCKET_TIMEOUT)
-                               .setRedirectsEnabled(true)
-                               .build();
-               httpget.setConfig(requestConfig);
                String responseContent = null;
                CloseableHttpResponse response = null;
 
@@ -85,12 +160,6 @@ public class HttpUtils {
                                httpget.releaseConnection();
                                httpget.abort();
                        }
-
-                       try {
-                               httpclient.close();
-                       } catch (IOException e) {
-                               logger.error(e.getMessage(),e);
-                       }
                }
                return responseContent;
        }
diff --git 
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/HttpUtilsTest.java
 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/HttpUtilsTest.java
index 90ed11a..521260a 100644
--- 
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/HttpUtilsTest.java
+++ 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/HttpUtilsTest.java
@@ -17,6 +17,7 @@
 package org.apache.dolphinscheduler.common.utils;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.http.impl.client.CloseableHttpClient;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -42,4 +43,11 @@ public class HttpUtilsTest {
                result = HttpUtils.get("https://123.333.111.33/ccc";);
                Assert.assertNull(result);
        }
+
+       @Test
+       public void testGetHttpClient() {
+               CloseableHttpClient httpClient1 = HttpUtils.getHttpClient();
+               CloseableHttpClient httpClient2 = HttpUtils.getHttpClient();
+               Assert.assertEquals(httpClient1, httpClient2);
+       }
 }

Reply via email to