diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/DefaultEurekaClientHttpRequestFactorySupplier.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/DefaultEurekaClientHttpRequestFactorySupplier.java index 3e43d883c..7c6ab8435 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/DefaultEurekaClientHttpRequestFactorySupplier.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/DefaultEurekaClientHttpRequestFactorySupplier.java @@ -55,10 +55,10 @@ public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClie private final Set requestConfigCustomizers; - private volatile CloseableHttpClient sharedHttpClient; - private final Object lock = new Object(); + private volatile CloseableHttpClient sharedHttpClient; + public DefaultEurekaClientHttpRequestFactorySupplier(TimeoutProperties timeoutProperties, Set requestConfigCustomizers) { this.timeoutProperties = timeoutProperties; @@ -67,20 +67,18 @@ public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClie @Override public ClientHttpRequestFactory get(SSLContext sslContext, @Nullable HostnameVerifier hostnameVerifier) { - CloseableHttpClient httpClient = this.sharedHttpClient; - if (httpClient == null) { - synchronized (this.lock) { - httpClient = this.sharedHttpClient; - if (httpClient == null) { - HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); - if (sslContext != null || hostnameVerifier != null || timeoutProperties != null) { - httpClientBuilder.setConnectionManager( - buildConnectionManager(sslContext, hostnameVerifier, timeoutProperties)); - } - httpClientBuilder.setDefaultRequestConfig(buildRequestConfig()); - httpClient = httpClientBuilder.build(); - this.sharedHttpClient = httpClient; + CloseableHttpClient httpClient; + synchronized (this.lock) { + httpClient = this.sharedHttpClient; + if (httpClient == null) { + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); + if (sslContext != null || hostnameVerifier != null || timeoutProperties != null) { + httpClientBuilder + .setConnectionManager(buildConnectionManager(sslContext, hostnameVerifier, timeoutProperties)); } + httpClientBuilder.setDefaultRequestConfig(buildRequestConfig()); + httpClient = httpClientBuilder.build(); + this.sharedHttpClient = httpClient; } } HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); @@ -90,13 +88,16 @@ public class DefaultEurekaClientHttpRequestFactorySupplier implements EurekaClie @Override public void close() { - CloseableHttpClient httpClient = this.sharedHttpClient; - if (httpClient != null) { - try { - httpClient.close(); - } - catch (IOException ex) { - // best-effort close during shutdown; nothing actionable if it fails + synchronized (this.lock) { + CloseableHttpClient httpClient = this.sharedHttpClient; + this.sharedHttpClient = null; + if (httpClient != null) { + try { + httpClient.close(); + } + catch (IOException ex) { + // best-effort close during shutdown; nothing actionable if it fails + } } } }