This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new 98168d23d63 SOLR-13605: HttpSolrClient.Builder.withHttpClient() is
useless for the purpose of setting client scoped so/connect timeouts (#1565)
98168d23d63 is described below
commit 98168d23d63a10d6bfb0e1b3cdcba24fe77764f9
Author: Eric Pugh <[email protected]>
AuthorDate: Sat Apr 29 10:31:57 2023 -0400
SOLR-13605: HttpSolrClient.Builder.withHttpClient() is useless for the
purpose of setting client scoped so/connect timeouts (#1565)
Properly handling HttpClient properties.
---------
Co-authored-by: Alex Deparvu <[email protected]>
---
solr/CHANGES.txt | 4 +-
.../client/solrj/impl/CloudLegacySolrClient.java | 21 +++-------
.../solrj/impl/ConcurrentUpdateSolrClient.java | 28 ++++++-------
.../solr/client/solrj/impl/HttpSolrClient.java | 47 +++++++++++-----------
.../solr/client/solrj/impl/LBHttpSolrClient.java | 22 ++++------
.../solr/client/solrj/impl/SolrClientBuilder.java | 36 ++++++++++++-----
.../solrj/impl/HttpSolrClientBuilderTest.java | 17 ++++++++
.../solrj/impl/LBHttpSolrClientBuilderTest.java | 19 +++++++++
8 files changed, 115 insertions(+), 79 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 2a64c01870b..76f699c01c5 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -53,7 +53,7 @@ Improvements
`GET /api/node/logging/messages`. And the threshold for the log "listener"
can be modified with
`PUT /api/node/logging/messages/threshold`. (Jason Gerlowski, Calvince
Otieno)
-* SOLR-16504: Convert CLI tools to use Jetty HTTP 2 client. (Bence Szabo via
Eric Pugh)
+* SOLR-16504: Convert CLI tools to use Jetty HTTP 2 client. (Bence Szabo via
Eric Pugh)
* SOLR-16752: Docker: Leave out optional apt packages, slightly reducing image
size and lowering attack surface (Quang-Cuong Bui)
@@ -130,6 +130,8 @@ Bug Fixes
* SOLR-16737: Http2SolrClient needs to inherit all properties when initialized
with another http2 client (Alex Deparvu, Tomás Fernández Löbbe)
+* SOLR-13605: Fix setting client scoped socket and connect timeouts when using
HttpSolrClient.Builder.withHttpClient() method. (Eric Pugh, Alex Deparvu)
+
Dependency Upgrades
---------------------
* PR#1494: Upgrade forbiddenapis to 3.5 (Uwe Schindler)
diff --git
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java
index 3299236dd44..4a94359fca5 100644
---
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java
+++
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java
@@ -107,14 +107,8 @@ public class CloudLegacySolrClient extends CloudSolrClient
{
private void propagateLBClientConfigOptions(Builder builder) {
final LBHttpSolrClient.Builder lbBuilder = builder.lbClientBuilder;
-
- if (builder.connectionTimeoutMillis != null) {
- lbBuilder.withConnectionTimeout(builder.connectionTimeoutMillis,
TimeUnit.MILLISECONDS);
- }
-
- if (builder.socketTimeoutMillis != null) {
- lbBuilder.withSocketTimeout(builder.socketTimeoutMillis,
TimeUnit.MILLISECONDS);
- }
+ lbBuilder.withConnectionTimeout(builder.connectionTimeoutMillis,
TimeUnit.MILLISECONDS);
+ lbBuilder.withSocketTimeout(builder.socketTimeoutMillis,
TimeUnit.MILLISECONDS);
}
@Override
@@ -177,14 +171,9 @@ public class CloudLegacySolrClient extends CloudSolrClient
{
Builder cloudSolrClientBuilder, HttpClient httpClient) {
final LBHttpSolrClient.Builder lbBuilder = new LBHttpSolrClient.Builder();
lbBuilder.withHttpClient(httpClient);
- if (cloudSolrClientBuilder.connectionTimeoutMillis != null) {
- lbBuilder.withConnectionTimeout(
- cloudSolrClientBuilder.connectionTimeoutMillis,
TimeUnit.MILLISECONDS);
- }
- if (cloudSolrClientBuilder.socketTimeoutMillis != null) {
- lbBuilder.withSocketTimeout(
- cloudSolrClientBuilder.socketTimeoutMillis, TimeUnit.MILLISECONDS);
- }
+ lbBuilder.withConnectionTimeout(
+ cloudSolrClientBuilder.connectionTimeoutMillis, TimeUnit.MILLISECONDS);
+ lbBuilder.withSocketTimeout(cloudSolrClientBuilder.socketTimeoutMillis,
TimeUnit.MILLISECONDS);
lbBuilder.withRequestWriter(new BinaryRequestWriter());
lbBuilder.withResponseParser(new BinaryResponseParser());
diff --git
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
index 2368cfbac77..212153467f1 100644
---
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
+++
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
@@ -87,8 +87,8 @@ public class ConcurrentUpdateSolrClient extends SolrClient {
int stallTime;
private final boolean streamDeletes;
private boolean internalHttpClient;
- private volatile Integer connectionTimeout;
- private volatile Integer soTimeout;
+ private final int connectionTimeout;
+ private final int soTimeout;
private volatile boolean closed;
AtomicInteger pollInterrupts;
@@ -114,12 +114,16 @@ public class ConcurrentUpdateSolrClient extends
SolrClient {
this.threadCount = builder.threadCount;
this.runners = new ArrayDeque<>();
this.streamDeletes = builder.streamDeletes;
- this.connectionTimeout = Math.toIntExact(builder.connectionTimeoutMillis);
- this.soTimeout = Math.toIntExact(builder.socketTimeoutMillis);
- this.stallTime = Integer.getInteger("solr.cloud.client.stallTime", 15000);
- if (stallTime < pollQueueTime * 2) {
- throw new RuntimeException(
- "Invalid stallTime: " + stallTime + "ms, must be 2x > pollQueueTime
" + pollQueueTime);
+ this.connectionTimeout = builder.connectionTimeoutMillis;
+ this.soTimeout = builder.socketTimeoutMillis;
+ this.pollQueueTimeMillis = builder.pollQueueTime;
+ this.stallTimeMillis = Integer.getInteger("solr.cloud.client.stallTime",
15000);
+
+ // make sure the stall time is larger than the polling time
+ // to give a chance for the queue to change
+ int minimalStallTime = pollQueueTimeMillis * 2;
+ if (minimalStallTime > this.stallTimeMillis) {
+ this.stallTimeMillis = minimalStallTime;
}
this.setPollQueueTime(builder.pollQueueTime);
@@ -341,12 +345,8 @@ public class ConcurrentUpdateSolrClient extends SolrClient
{
org.apache.http.client.config.RequestConfig.Builder
requestConfigBuilder =
HttpClientUtil.createDefaultRequestConfigBuilder();
- if (soTimeout != null) {
- requestConfigBuilder.setSocketTimeout(soTimeout);
- }
- if (connectionTimeout != null) {
- requestConfigBuilder.setConnectTimeout(connectionTimeout);
- }
+ requestConfigBuilder.setSocketTimeout(soTimeout);
+ requestConfigBuilder.setConnectTimeout(connectionTimeout);
method.setConfig(requestConfigBuilder.build());
diff --git
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
index 328ab695a22..7e893cab1ad 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
@@ -150,8 +150,8 @@ public class HttpSolrClient extends BaseHttpSolrClient {
private final boolean internalClient;
private volatile Set<String> urlParamNames = Set.of();
- private volatile Integer connectionTimeout;
- private volatile Integer soTimeout;
+ private final int connectionTimeout;
+ private final int soTimeout;
/** Use the builder to create this client */
protected HttpSolrClient(Builder builder) {
@@ -169,13 +169,14 @@ public class HttpSolrClient extends BaseHttpSolrClient {
this.internalClient = false;
this.followRedirects = builder.followRedirects;
this.httpClient = builder.httpClient;
-
} else {
this.internalClient = true;
this.followRedirects = builder.followRedirects;
ModifiableSolrParams params = new ModifiableSolrParams();
params.set(HttpClientUtil.PROP_FOLLOW_REDIRECTS, followRedirects);
params.set(HttpClientUtil.PROP_ALLOW_COMPRESSION, builder.compression);
+ params.set(HttpClientUtil.PROP_CONNECTION_TIMEOUT,
builder.connectionTimeoutMillis);
+ params.set(HttpClientUtil.PROP_SO_TIMEOUT, builder.socketTimeoutMillis);
httpClient = HttpClientUtil.createClient(params);
}
@@ -185,8 +186,8 @@ public class HttpSolrClient extends BaseHttpSolrClient {
this.parser = builder.responseParser;
this.invariantParams = builder.invariantParams;
- this.connectionTimeout = Math.toIntExact(builder.connectionTimeoutMillis);
- this.soTimeout = Math.toIntExact(builder.socketTimeoutMillis);
+ this.connectionTimeout = builder.connectionTimeoutMillis;
+ this.soTimeout = builder.socketTimeoutMillis;
this.useMultiPartPost = builder.useMultiPartPost;
this.urlParamNames = builder.urlParamNames;
}
@@ -204,20 +205,23 @@ public class HttpSolrClient extends BaseHttpSolrClient {
}
/**
- * Expert Method
+ * Returns the connection timeout, and should be based on httpClient
overriding the solrClient.
+ * For unit testing.
*
- * @param urlParamNames set of param keys to only send via the query string
Note that the param
- * will be sent as a query string if the key is part of this Set or the
SolrRequest's query
- * params.
- * <p>{@link SolrClient} setters can be unsafe when the involved {@link
SolrClient} is used in
- * multiple threads simultaneously. To avoid this, use {@link
- * Builder#withTheseParamNamesInTheUrl(Set)}.
- * @see org.apache.solr.client.solrj.SolrRequest#getQueryParams
- * @deprecated use {@link Builder#withTheseParamNamesInTheUrl(Set)} instead
+ * @return the connection timeout
*/
- @Deprecated
- public void setQueryParams(Set<String> urlParamNames) {
- this.urlParamNames = urlParamNames;
+ int getConnectionTimeout() {
+ return this.connectionTimeout;
+ }
+
+ /**
+ * Returns the socket timeout, and should be based on httpClient overriding
the solrClient. For
+ * unit testing.
+ *
+ * @return the socket timeout
+ */
+ int getSocketTimeout() {
+ return this.soTimeout;
}
/**
@@ -574,12 +578,9 @@ public class HttpSolrClient extends BaseHttpSolrClient {
org.apache.http.client.config.RequestConfig.Builder requestConfigBuilder =
HttpClientUtil.createDefaultRequestConfigBuilder();
- if (soTimeout != null) {
- requestConfigBuilder.setSocketTimeout(soTimeout);
- }
- if (connectionTimeout != null) {
- requestConfigBuilder.setConnectTimeout(connectionTimeout);
- }
+ requestConfigBuilder.setSocketTimeout(soTimeout);
+ requestConfigBuilder.setConnectTimeout(connectionTimeout);
+
if (followRedirects != null) {
requestConfigBuilder.setRedirectsEnabled(followRedirects);
}
diff --git
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
index a7553f3fc5d..8b9f23b0eba 100644
---
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
+++
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
@@ -81,8 +81,8 @@ public class LBHttpSolrClient extends LBSolrClient {
private final HttpSolrClient.Builder httpSolrClientBuilder;
private volatile Set<String> urlParamNames = new HashSet<>();
- private Long connectionTimeoutMillis;
- private Long soTimeoutMillis;
+ final int connectionTimeoutMillis;
+ final int soTimeoutMillis;
/** The provided httpClient should use a multi-threaded connection manager */
protected LBHttpSolrClient(Builder builder) {
@@ -118,13 +118,9 @@ public class LBHttpSolrClient extends LBSolrClient {
if (httpSolrClientBuilder != null) {
synchronized (this) {
httpSolrClientBuilder.withBaseSolrUrl(server).withHttpClient(httpClient);
- if (connectionTimeoutMillis != null) {
- httpSolrClientBuilder.withConnectionTimeout(
- connectionTimeoutMillis, TimeUnit.MILLISECONDS);
- }
- if (soTimeoutMillis != null) {
- httpSolrClientBuilder.withSocketTimeout(soTimeoutMillis,
TimeUnit.MILLISECONDS);
- }
+ httpSolrClientBuilder.withConnectionTimeout(connectionTimeoutMillis,
TimeUnit.MILLISECONDS);
+ httpSolrClientBuilder.withSocketTimeout(soTimeoutMillis,
TimeUnit.MILLISECONDS);
+
if (requestWriter != null) {
httpSolrClientBuilder.withRequestWriter(requestWriter);
}
@@ -136,12 +132,8 @@ public class LBHttpSolrClient extends LBSolrClient {
} else {
final HttpSolrClient.Builder clientBuilder =
new
HttpSolrClient.Builder(server).withHttpClient(httpClient).withResponseParser(parser);
- if (connectionTimeoutMillis != null) {
- clientBuilder.withConnectionTimeout(connectionTimeoutMillis,
TimeUnit.MILLISECONDS);
- }
- if (soTimeoutMillis != null) {
- clientBuilder.withSocketTimeout(soTimeoutMillis,
TimeUnit.MILLISECONDS);
- }
+ clientBuilder.withConnectionTimeout(connectionTimeoutMillis,
TimeUnit.MILLISECONDS);
+ clientBuilder.withSocketTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS);
if (requestWriter != null) {
clientBuilder.withRequestWriter(requestWriter);
}
diff --git
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientBuilder.java
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientBuilder.java
index d6e31e5ef97..645a19040de 100644
---
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientBuilder.java
+++
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientBuilder.java
@@ -19,6 +19,8 @@ package org.apache.solr.client.solrj.impl;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.Configurable;
import org.apache.solr.client.solrj.ResponseParser;
import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder;
import org.apache.solr.client.solrj.request.RequestWriter;
@@ -34,8 +36,10 @@ public abstract class SolrClientBuilder<B extends
SolrClientBuilder<B>> {
protected ResponseParser responseParser;
protected RequestWriter requestWriter;
protected boolean useMultiPartPost;
- protected Long connectionTimeoutMillis = TimeUnit.MILLISECONDS.convert(15,
TimeUnit.SECONDS);
- protected Long socketTimeoutMillis = TimeUnit.MILLISECONDS.convert(120,
TimeUnit.SECONDS);
+ protected int connectionTimeoutMillis = 15000; // 15 seconds
+ private boolean connectionTimeoutMillisUpdate = false;
+ protected int socketTimeoutMillis = 120000; // 120 seconds
+ private boolean socketTimeoutMillisUpdate = false;
protected boolean followRedirects = false;
protected Set<String> urlParamNames;
@@ -45,6 +49,17 @@ public abstract class SolrClientBuilder<B extends
SolrClientBuilder<B>> {
/** Provides a {@link HttpClient} for the builder to use when creating
clients. */
public B withHttpClient(HttpClient httpClient) {
this.httpClient = httpClient;
+
+ if (this.httpClient instanceof Configurable) {
+ RequestConfig conf = ((Configurable) httpClient).getConfig();
+ // only update values that were not already manually changed
+ if (!connectionTimeoutMillisUpdate && conf.getConnectTimeout() > 0) {
+ this.connectionTimeoutMillis = conf.getConnectTimeout();
+ }
+ if (!socketTimeoutMillisUpdate && conf.getSocketTimeout() > 0) {
+ this.socketTimeoutMillis = conf.getSocketTimeout();
+ }
+ }
return getThis();
}
@@ -88,7 +103,7 @@ public abstract class SolrClientBuilder<B extends
SolrClientBuilder<B>> {
*
* <p>For valid values see {@link
org.apache.http.client.config.RequestConfig#getConnectTimeout()}
*
- * @deprecated Please use {@link #withConnectionTimeout(long, TimeUnit)}
+ * @deprecated Please use {@link #withConnectionTimeout(int, TimeUnit)}
*/
@Deprecated(since = "9.2")
public B withConnectionTimeout(int connectionTimeoutMillis) {
@@ -102,12 +117,13 @@ public abstract class SolrClientBuilder<B extends
SolrClientBuilder<B>> {
*
* <p>For valid values see {@link
org.apache.http.client.config.RequestConfig#getConnectTimeout()}
*/
- public B withConnectionTimeout(long connectionTimeout, TimeUnit unit) {
+ public B withConnectionTimeout(int connectionTimeout, TimeUnit unit) {
if (connectionTimeout < 0) {
throw new IllegalArgumentException("connectionTimeout must be a
non-negative integer.");
}
-
- this.connectionTimeoutMillis =
TimeUnit.MILLISECONDS.convert(connectionTimeout, unit);
+ this.connectionTimeoutMillis =
+ Math.toIntExact(TimeUnit.MILLISECONDS.convert(connectionTimeout,
unit));
+ connectionTimeoutMillisUpdate = true;
return getThis();
}
@@ -117,7 +133,7 @@ public abstract class SolrClientBuilder<B extends
SolrClientBuilder<B>> {
*
* <p>For valid values see {@link
org.apache.http.client.config.RequestConfig#getSocketTimeout()}
*
- * <p>* @deprecated Please use {@link #withSocketTimeout(long, TimeUnit)}
+ * <p>* @deprecated Please use {@link #withSocketTimeout(int, TimeUnit)}
*/
@Deprecated(since = "9.2")
public B withSocketTimeout(int socketTimeoutMillis) {
@@ -131,12 +147,12 @@ public abstract class SolrClientBuilder<B extends
SolrClientBuilder<B>> {
*
* <p>For valid values see {@link
org.apache.http.client.config.RequestConfig#getSocketTimeout()}
*/
- public B withSocketTimeout(long socketTimeout, TimeUnit unit) {
+ public B withSocketTimeout(int socketTimeout, TimeUnit unit) {
if (socketTimeout < 0) {
throw new IllegalArgumentException("socketTimeout must be a non-negative
integer.");
}
-
- this.socketTimeoutMillis = TimeUnit.MILLISECONDS.convert(socketTimeout,
unit);
+ this.socketTimeoutMillis =
Math.toIntExact(TimeUnit.MILLISECONDS.convert(socketTimeout, unit));
+ socketTimeoutMillisUpdate = true;
return getThis();
}
}
diff --git
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientBuilderTest.java
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientBuilderTest.java
index dbe01b0be15..eea4fcfc3b8 100644
---
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientBuilderTest.java
+++
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientBuilderTest.java
@@ -23,6 +23,7 @@ import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.solr.SolrTestCase;
import org.apache.solr.client.solrj.ResponseParser;
import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder;
+import org.apache.solr.common.params.ModifiableSolrParams;
import org.junit.Test;
/** Unit tests for {@link Builder}. */
@@ -51,6 +52,22 @@ public class HttpSolrClientBuilderTest extends SolrTestCase {
}
}
+ @Test
+ public void testUsesTimeoutProvidedByHttpClient() throws IOException {
+
+ ModifiableSolrParams clientParams = new ModifiableSolrParams();
+ clientParams.set(HttpClientUtil.PROP_SO_TIMEOUT, 12345);
+ clientParams.set(HttpClientUtil.PROP_CONNECTION_TIMEOUT, 67890);
+ HttpClient httpClient = HttpClientUtil.createClient(clientParams);
+ try (HttpSolrClient createdClient =
+ new Builder(ANY_BASE_SOLR_URL).withHttpClient(httpClient).build()) {
+ assertEquals(createdClient.getHttpClient(), httpClient);
+ assertEquals(67890, createdClient.getConnectionTimeout());
+ assertEquals(12345, createdClient.getSocketTimeout());
+ }
+ HttpClientUtil.close(httpClient);
+ }
+
@Test
public void testProvidesResponseParserToClient() throws IOException {
try (HttpSolrClient createdClient =
diff --git
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttpSolrClientBuilderTest.java
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttpSolrClientBuilderTest.java
index e1c0fb55008..25a70f5460c 100644
---
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttpSolrClientBuilderTest.java
+++
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttpSolrClientBuilderTest.java
@@ -17,11 +17,13 @@
package org.apache.solr.client.solrj.impl;
+import java.io.IOException;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.solr.SolrTestCase;
import org.apache.solr.client.solrj.ResponseParser;
import org.apache.solr.client.solrj.impl.LBHttpSolrClient.Builder;
+import org.apache.solr.common.params.ModifiableSolrParams;
import org.junit.Test;
/** Unit tests for {@link Builder}. */
@@ -58,4 +60,21 @@ public class LBHttpSolrClientBuilderTest extends
SolrTestCase {
assertTrue(usedParser instanceof BinaryResponseParser);
}
}
+
+ @Test
+ public void testUsesTimeoutProvidedByHttpClient() throws IOException {
+
+ ModifiableSolrParams clientParams = new ModifiableSolrParams();
+ clientParams.set(HttpClientUtil.PROP_SO_TIMEOUT, 12345);
+ clientParams.set(HttpClientUtil.PROP_CONNECTION_TIMEOUT, 67890);
+ HttpClient httpClient = HttpClientUtil.createClient(clientParams);
+
+ try (LBHttpSolrClient createdClient =
+ new
Builder().withBaseSolrUrl(ANY_BASE_SOLR_URL).withHttpClient(httpClient).build())
{
+ assertEquals(createdClient.getHttpClient(), httpClient);
+ assertEquals(67890, createdClient.connectionTimeoutMillis);
+ assertEquals(12345, createdClient.soTimeoutMillis);
+ }
+ HttpClientUtil.close(httpClient);
+ }
}