18
18
import org .apache .http .*;
19
19
import org .apache .http .HttpResponse ;
20
20
import org .apache .http .client .config .CookieSpecs ;
21
+ import org .apache .http .conn .DnsResolver ;
21
22
import org .apache .http .conn .routing .HttpRoute ;
22
23
import org .apache .http .conn .ssl .NoopHostnameVerifier ;
23
24
import org .apache .http .entity .ContentType ;
24
25
import org .apache .http .conn .ssl .SSLConnectionSocketFactory ;
25
26
import org .apache .http .impl .conn .PoolingHttpClientConnectionManager ;
27
+ import org .apache .http .impl .conn .SystemDefaultDnsResolver ;
26
28
import org .apache .http .protocol .HttpContext ;
27
29
import org .apache .http .auth .AuthSchemeProvider ;
28
30
import org .apache .http .auth .AuthScope ;
64
66
65
67
public class HttpClientJavaLib extends GXHttpClient {
66
68
69
+ private static final DnsResolver FIRST_IP_DNS_RESOLVER = host -> {
70
+ InetAddress [] allIps = SystemDefaultDnsResolver .INSTANCE .resolve (host );
71
+ if (allIps != null && allIps .length > 1 ) {
72
+ return new InetAddress []{allIps [0 ]};
73
+ }
74
+ return allIps ;
75
+ };
76
+
77
+ private static boolean isFirstIpDnsEnabled () {
78
+ String name = "GX_USE_FIRST_IP_DNS" ;
79
+ String gxDns = System .getProperty (name );
80
+ if (gxDns == null || gxDns .trim ().isEmpty ()) {
81
+ gxDns = System .getenv (name );
82
+ }
83
+ return gxDns != null && gxDns .trim ().equalsIgnoreCase ("true" );
84
+ }
85
+
67
86
public HttpClientJavaLib () {
68
87
getPoolInstance ();
69
88
ConnectionKeepAliveStrategy myStrategy = generateKeepAliveStrategy ();
70
- httpClientBuilder = HttpClients .custom ().setConnectionManager (connManager ).setConnectionManagerShared (true ).setKeepAliveStrategy (myStrategy );
71
- cookies = new BasicCookieStore ();
89
+ HttpClientBuilder builder = HttpClients .custom ()
90
+ .setConnectionManager (connManager )
91
+ .setConnectionManagerShared (true )
92
+ .setKeepAliveStrategy (myStrategy );
93
+ if (isFirstIpDnsEnabled ()) {
94
+ builder .setDnsResolver (FIRST_IP_DNS_RESOLVER );
95
+ }
96
+ httpClientBuilder = builder ;
97
+ cookies = new BasicCookieStore ();
72
98
streamsToClose = new Vector <>();
73
99
}
74
100
@@ -78,7 +104,11 @@ private static void getPoolInstance() {
78
104
RegistryBuilder .<ConnectionSocketFactory >create ()
79
105
.register ("http" , PlainConnectionSocketFactory .INSTANCE ).register ("https" ,getSSLSecureInstance ())
80
106
.build ();
81
- connManager = new PoolingHttpClientConnectionManager (socketFactoryRegistry );
107
+ if (isFirstIpDnsEnabled ()) {
108
+ connManager = new PoolingHttpClientConnectionManager (socketFactoryRegistry , FIRST_IP_DNS_RESOLVER );
109
+ } else {
110
+ connManager = new PoolingHttpClientConnectionManager (socketFactoryRegistry );
111
+ }
82
112
connManager .setMaxTotal ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_SIZE" , "1000" )));
83
113
connManager .setDefaultMaxPerRoute ((int ) CommonUtil .val (clientCfg .getProperty ("Client" , "HTTPCLIENT_MAX_PER_ROUTE" , "1000" )));
84
114
@@ -620,7 +650,7 @@ public void execute(String method, String url) {
620
650
resetStateAdapted ();
621
651
}
622
652
}
623
-
653
+
624
654
private synchronized void displayHTTPConnections (){
625
655
Iterator <HttpRoute > iterator = storedRoutes .iterator ();
626
656
while (iterator .hasNext ()) {
0 commit comments