1818import org .apache .http .*;
1919import org .apache .http .HttpResponse ;
2020import org .apache .http .client .config .CookieSpecs ;
21+ import org .apache .http .conn .DnsResolver ;
2122import org .apache .http .conn .routing .HttpRoute ;
2223import org .apache .http .conn .ssl .NoopHostnameVerifier ;
2324import org .apache .http .entity .ContentType ;
2425import org .apache .http .impl .conn .PoolingHttpClientConnectionManager ;
26+ import org .apache .http .impl .conn .SystemDefaultDnsResolver ;
2527import org .apache .http .protocol .HttpContext ;
2628import org .apache .http .auth .AuthSchemeProvider ;
2729import org .apache .http .auth .AuthScope ;
6466
6567public class HttpClientJavaLib extends GXHttpClient {
6668
69+ private static class FirstIpDnsResolver implements DnsResolver {
70+ private final DnsResolver defaultDnsResolver = new SystemDefaultDnsResolver ();
71+
72+ @ Override
73+ public InetAddress [] resolve (final String host ) throws UnknownHostException {
74+ InetAddress [] allIps = defaultDnsResolver .resolve (host );
75+ if (allIps != null && allIps .length > 0 ) {
76+ return new InetAddress []{allIps [0 ]};
77+ }
78+ return allIps ;
79+ }
80+ }
81+
82+ private static String getGxIpResolverConfig () {
83+ String name = "GX_USE_FIRST_IP_DNS" ;
84+ String gxDns = System .getProperty (name );
85+ if (gxDns == null || gxDns .trim ().isEmpty ()) {
86+ gxDns = System .getenv (name );
87+ }
88+ if (gxDns != null && gxDns .trim ().equalsIgnoreCase ("true" )) {
89+ return gxDns .trim ();
90+ } else {
91+ return null ;
92+ }
93+ }
94+
95+
6796 public HttpClientJavaLib () {
6897 getPoolInstance ();
6998 ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy ();
70- httpClientBuilder = HttpClients .custom ().setConnectionManager (connManager ).setConnectionManagerShared (true ).setKeepAliveStrategy (myStrategy );
99+ HttpClientBuilder builder = HttpClients .custom ()
100+ .setConnectionManager (connManager )
101+ .setConnectionManagerShared (true )
102+ .setKeepAliveStrategy (myStrategy );
103+ if (getGxIpResolverConfig () != null ) {
104+ builder .setDnsResolver (new FirstIpDnsResolver ());
105+ }
106+ httpClientBuilder = builder ;
71107 cookies = new BasicCookieStore ();
72108 streamsToClose = new Vector <>();
73109 }
@@ -78,7 +114,10 @@ private static void getPoolInstance() {
78114 RegistryBuilder .<ConnectionSocketFactory >create ()
79115 .register ("http" , PlainConnectionSocketFactory .INSTANCE ).register ("https" , getSSLSecureInstance ())
80116 .build ();
81- connManager = new PoolingHttpClientConnectionManager (socketFactoryRegistry );
117+ boolean useCustomDnsResolver = getGxIpResolverConfig () != null ;
118+ PoolingHttpClientConnectionManager connManager = useCustomDnsResolver
119+ ? new PoolingHttpClientConnectionManager (socketFactoryRegistry , new FirstIpDnsResolver ())
120+ : new PoolingHttpClientConnectionManager (socketFactoryRegistry );
82121 connManager .setMaxTotal ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_SIZE" , "1000" )));
83122 connManager .setDefaultMaxPerRoute ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_PER_ROUTE" , "1000" )));
84123
0 commit comments