Skip to content

Commit 6b43582

Browse files
author
mizantrop2397
authored
Merge pull request #266 from art-community/fix/http-client-fixes
fixes to HTTP Client configuring
2 parents 4385169 + c894a76 commit 6b43582

File tree

11 files changed

+91
-33
lines changed

11 files changed

+91
-33
lines changed

application-config-extensions/src/main/java/ru/art/config/extensions/http/HttpClientAgileConfiguration.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public class HttpClientAgileConfiguration extends HttpClientModuleDefaultConfigu
6060
private boolean enableValueTracing;
6161
private MimeToContentTypeMapper consumesMimeTypeMapper;
6262
private MimeToContentTypeMapper producesMimeTypeMapper;
63+
private int maxConnectionsPerRoute;
64+
private int maxConnectionsTotal;
6365

6466
public HttpClientAgileConfiguration() {
6567
refresh();
@@ -119,5 +121,7 @@ public void refresh() {
119121
sslKeyStoreType = configString(HTTP_COMMUNICATION_SECTION_ID, SSL_KEY_STORE_TYPE, super.getSslKeyStoreType());
120122
sslKeyStoreFilePath = configString(HTTP_COMMUNICATION_SECTION_ID, SSL_KEY_STORE_FILE_PATH, super.getSslKeyStoreFilePath());
121123
sslKeyStorePassword = configString(HTTP_COMMUNICATION_SECTION_ID, SSL_KEY_STORE_PASSWORD, super.getSslKeyStorePassword());
124+
maxConnectionsPerRoute = configInt(HTTP_COMMUNICATION_SECTION_ID, MAX_CONNECTIONS_PER_ROUTE, super.getMaxConnectionsPerRoute());
125+
maxConnectionsTotal = configInt(HTTP_COMMUNICATION_SECTION_ID, MAX_CONNECTIONS_TOTAL, super.getMaxConnectionsTotal());
122126
}
123127
}

application-config-extensions/src/main/java/ru/art/config/extensions/http/HttpConfigKeys.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ public interface HttpConfigKeys {
3333
String SSL = "ssl";
3434
String SSL_KEY_STORE_FILE_PATH = "sslKeyStoreFilePath";
3535
String SSL_KEY_STORE_PASSWORD = "sslKeyStorePassword";
36+
String MAX_CONNECTIONS_PER_ROUTE = "maxConnectionsPerRoute";
37+
String MAX_CONNECTIONS_TOTAL = "maxConnectionsTotal";
3638
String SSL_KEY_STORE_TYPE = "sslKeyStoreType";
3739
String CONSUMES_MIME_TYPE = "consumesMimeType";
3840
String PRODUCES_MIME_TYPE = "producesMimeType";
3941
String WEB = "web";
42+
4043
}

application-grpc-client/src/main/java/ru/art/grpc/client/communicator/GrpcCommunicatorChannelFactory.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package ru.art.grpc.client.communicator;
22

33
import io.grpc.*;
4+
import io.grpc.internal.*;
5+
import io.grpc.util.*;
6+
import io.netty.resolver.*;
7+
import ru.art.grpc.client.interceptor.*;
48
import static io.grpc.ManagedChannelBuilder.*;
59
import static java.util.concurrent.TimeUnit.*;
610
import static ru.art.core.context.Context.*;

application-http-client/src/main/java/ru/art/http/client/communicator/HttpCommunicationConfiguration.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,16 @@
2626
import ru.art.entity.Value;
2727
import ru.art.entity.interceptor.*;
2828
import ru.art.entity.mapper.*;
29+
import ru.art.http.client.constants.*;
30+
import ru.art.http.client.constants.HttpClientModuleConstants.*;
2931
import ru.art.http.client.handler.*;
3032
import ru.art.http.client.interceptor.*;
3133
import ru.art.http.constants.*;
3234
import static lombok.AccessLevel.*;
3335
import static ru.art.core.context.Context.*;
3436
import static ru.art.core.factory.CollectionsFactory.*;
37+
import static ru.art.http.client.constants.HttpClientModuleConstants.HttpClientKeepAliveHeaderStrategy.CONSIDER;
38+
import static ru.art.http.client.constants.HttpClientModuleConstants.HttpClientKeepAliveHeaderStrategy.IGNORE;
3539
import static ru.art.http.client.module.HttpClientModule.*;
3640
import static ru.art.http.constants.HttpMethodType.*;
3741
import java.nio.charset.*;
@@ -54,6 +58,7 @@ class HttpCommunicationConfiguration {
5458
private HttpCommunicationCancellationHandler<?> cancellationHandler;
5559
private boolean chunkedBody;
5660
private boolean gzipCompressedBody;
61+
private HttpClientKeepAliveHeaderStrategy keepAliveResponseHeaderStrategy = IGNORE;
5762
private RequestConfig requestConfig = httpClientModule().getRequestConfig();
5863
private HttpVersion httpProtocolVersion = httpClientModule().getHttpVersion();
5964
private MimeToContentTypeMapper producesMimeType = httpClientModule().getProducesMimeTypeMapper();

application-http-client/src/main/java/ru/art/http/client/communicator/HttpCommunicationExecutor.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import ru.art.entity.Value;
3333
import ru.art.entity.interceptor.*;
3434
import ru.art.entity.mapper.*;
35+
import ru.art.http.client.constants.*;
3536
import ru.art.http.client.exception.*;
3637
import ru.art.http.client.handler.*;
3738
import ru.art.http.client.interceptor.*;
@@ -51,6 +52,8 @@
5152
import static ru.art.http.client.body.descriptor.HttpBodyDescriptor.*;
5253
import static ru.art.http.client.builder.HttpUriBuilder.*;
5354
import static ru.art.http.client.constants.HttpClientExceptionMessages.*;
55+
import static ru.art.http.client.constants.HttpClientModuleConstants.HttpClientKeepAliveHeaderStrategy.CONSIDER;
56+
import static ru.art.http.client.constants.HttpClientModuleConstants.HttpClientKeepAliveHeaderStrategy.IGNORE;
5457
import static ru.art.http.client.module.HttpClientModule.*;
5558
import static ru.art.logging.LoggingModule.*;
5659
import javax.annotation.*;
@@ -88,7 +91,7 @@ private static <ResponseType> ResponseType executeHttpUriRequest(HttpCommunicati
8891
} catch (Throwable throwable) {
8992
throw new HttpClientException(throwable);
9093
} finally {
91-
if (nonNull(httpResponse)) {
94+
if (nonNull(httpResponse) && configuration.getKeepAliveResponseHeaderStrategy() == IGNORE) {
9295
try {
9396
httpResponse.close();
9497
} catch (Throwable closableThrowable) {

application-http-client/src/main/java/ru/art/http/client/communicator/HttpCommunicator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ static HttpCommunicator httpCommunicator(HttpCommunicationTargetConfiguration ta
7676

7777
HttpCommunicator options();
7878

79+
HttpCommunicator considerKeepAliveResponseHeader();
80+
81+
HttpCommunicator ignoreKeepAliveResponseHeader();
82+
7983
HttpCommunicator delete();
8084

8185
HttpCommunicator trace();

application-http-client/src/main/java/ru/art/http/client/communicator/HttpCommunicatorImplementation.java

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,37 @@
1919
package ru.art.http.client.communicator;
2020

2121
import lombok.*;
22-
import org.apache.http.HttpVersion;
23-
import org.apache.http.client.config.RequestConfig;
24-
import org.apache.http.impl.client.CloseableHttpClient;
25-
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
22+
import org.apache.http.*;
23+
import org.apache.http.client.config.*;
24+
import org.apache.http.impl.client.*;
25+
import org.apache.http.impl.nio.client.*;
2626
import org.apache.logging.log4j.*;
27-
import ru.art.core.validator.BuilderValidator;
27+
import ru.art.core.validator.*;
2828
import ru.art.entity.Value;
29-
import ru.art.entity.interceptor.ValueInterceptor;
30-
import ru.art.entity.mapper.ValueFromModelMapper;
31-
import ru.art.entity.mapper.ValueToModelMapper;
32-
import ru.art.http.client.communicator.HttpCommunicator.HttpAsynchronousCommunicator;
33-
import ru.art.http.client.handler.HttpCommunicationCancellationHandler;
34-
import ru.art.http.client.handler.HttpCommunicationExceptionHandler;
35-
import ru.art.http.client.handler.HttpCommunicationResponseHandler;
36-
import ru.art.http.client.interceptor.HttpClientInterceptor;
37-
import ru.art.http.client.model.HttpCommunicationTargetConfiguration;
38-
import ru.art.http.constants.MimeToContentTypeMapper;
39-
import static java.util.Optional.ofNullable;
40-
import static lombok.AccessLevel.PRIVATE;
41-
import static ru.art.core.caster.Caster.cast;
42-
import static ru.art.core.checker.CheckerForEmptiness.isNotEmpty;
43-
import static ru.art.core.constants.StringConstants.COLON;
44-
import static ru.art.core.constants.StringConstants.SCHEME_DELIMITER;
45-
import static ru.art.core.context.Context.contextConfiguration;
46-
import static ru.art.core.extension.NullCheckingExtensions.getOrElse;
47-
import static ru.art.core.extension.StringExtensions.emptyIfNull;
48-
import static ru.art.core.wrapper.ExceptionWrapper.ignoreException;
49-
import static ru.art.http.client.communicator.HttpCommunicationExecutor.executeAsynchronousHttpRequest;
50-
import static ru.art.http.client.communicator.HttpCommunicationExecutor.executeSynchronousHttpRequest;
51-
import static ru.art.http.client.module.HttpClientModule.httpClientModule;
29+
import ru.art.entity.interceptor.*;
30+
import ru.art.entity.mapper.*;
31+
import ru.art.http.client.communicator.HttpCommunicator.*;
32+
import ru.art.http.client.handler.*;
33+
import ru.art.http.client.interceptor.*;
34+
import ru.art.http.client.model.*;
35+
import ru.art.http.constants.*;
36+
import static java.util.Optional.*;
37+
import static lombok.AccessLevel.*;
38+
import static ru.art.core.caster.Caster.*;
39+
import static ru.art.core.checker.CheckerForEmptiness.*;
40+
import static ru.art.core.constants.StringConstants.*;
41+
import static ru.art.core.context.Context.*;
42+
import static ru.art.core.extension.NullCheckingExtensions.*;
43+
import static ru.art.core.extension.StringExtensions.*;
44+
import static ru.art.core.wrapper.ExceptionWrapper.*;
45+
import static ru.art.http.client.communicator.HttpCommunicationExecutor.*;
46+
import static ru.art.http.client.constants.HttpClientModuleConstants.HttpClientKeepAliveHeaderStrategy.*;
47+
import static ru.art.http.client.module.HttpClientModule.*;
5248
import static ru.art.http.constants.HttpMethodType.*;
53-
import static ru.art.logging.LoggingModule.loggingModule;
54-
import java.nio.charset.Charset;
55-
import java.util.Optional;
56-
import java.util.concurrent.CompletableFuture;
49+
import static ru.art.logging.LoggingModule.*;
50+
import java.nio.charset.*;
51+
import java.util.*;
52+
import java.util.concurrent.*;
5753

5854
public class HttpCommunicatorImplementation implements HttpCommunicator, HttpAsynchronousCommunicator {
5955
private final BuilderValidator validator = new BuilderValidator(HttpCommunicator.class.getName());
@@ -224,6 +220,18 @@ public HttpCommunicator gzipCompressed() {
224220
return this;
225221
}
226222

223+
@Override
224+
public HttpCommunicator ignoreKeepAliveResponseHeader() {
225+
configuration.setKeepAliveResponseHeaderStrategy(IGNORE);
226+
return this;
227+
}
228+
229+
@Override
230+
public HttpCommunicator considerKeepAliveResponseHeader() {
231+
configuration.setKeepAliveResponseHeaderStrategy(CONSIDER);
232+
return this;
233+
}
234+
227235
@Override
228236
public HttpCommunicator requestEncoding(String encoding) {
229237
configuration.setRequestContentEncoding(emptyIfNull(encoding));

application-http-client/src/main/java/ru/art/http/client/configuration/HttpClientModuleConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020

2121
import lombok.*;
2222
import org.apache.http.*;
23+
import org.apache.http.client.*;
2324
import org.apache.http.client.config.*;
2425
import org.apache.http.config.*;
2526
import org.apache.http.impl.client.*;
2627
import org.apache.http.impl.nio.client.*;
2728
import org.apache.http.impl.nio.reactor.*;
2829
import org.zalando.logbook.httpclient.*;
30+
import ru.art.http.client.constants.*;
2931
import ru.art.http.client.exception.*;
3032
import ru.art.http.client.interceptor.*;
3133
import ru.art.http.client.model.*;
@@ -52,6 +54,10 @@
5254
import java.util.*;
5355

5456
public interface HttpClientModuleConfiguration extends HttpModuleConfiguration {
57+
int getMaxConnectionsPerRoute();
58+
59+
int getMaxConnectionsTotal();
60+
5561
CloseableHttpClient getClient();
5662

5763
CloseableHttpAsyncClient getAsynchronousClient();
@@ -97,6 +103,8 @@ default HttpCommunicationTargetConfiguration getCommunicationTargetConfiguration
97103

98104
@Getter
99105
class HttpClientModuleDefaultConfiguration extends HttpModuleDefaultConfiguration implements HttpClientModuleConfiguration {
106+
int maxConnectionsPerRoute = DEFAULT_MAX_CONNECTIONS_PER_ROUTE;
107+
int maxConnectionsTotal = DEFAULT_MAX_CONNECTIONS_TOTAL;
100108
private final RequestConfig requestConfig = RequestConfig.DEFAULT;
101109
private final SocketConfig socketConfig = SocketConfig.DEFAULT;
102110
private final ConnectionConfig connectionConfig = ConnectionConfig.DEFAULT;
@@ -124,6 +132,8 @@ class HttpClientModuleDefaultConfiguration extends HttpModuleDefaultConfiguratio
124132
@SuppressWarnings({"Duplicates", "WeakerAccess"})
125133
protected CloseableHttpAsyncClient createAsyncHttpClient() {
126134
HttpAsyncClientBuilder clientBuilder = HttpAsyncClients.custom()
135+
.setMaxConnPerRoute(getMaxConnectionsPerRoute())
136+
.setMaxConnTotal(getMaxConnectionsTotal())
127137
.setDefaultRequestConfig(getRequestConfig())
128138
.setDefaultIOReactorConfig(getIoReactorConfig())
129139
.setDefaultConnectionConfig(getConnectionConfig());
@@ -149,6 +159,8 @@ protected CloseableHttpAsyncClient createAsyncHttpClient() {
149159
@SuppressWarnings({"Duplicates", "WeakerAccess"})
150160
protected CloseableHttpClient createHttpClient() {
151161
HttpClientBuilder clientBuilder = HttpClients.custom()
162+
.setMaxConnPerRoute(getMaxConnectionsPerRoute())
163+
.setMaxConnTotal(getMaxConnectionsTotal())
152164
.setDefaultRequestConfig(getRequestConfig())
153165
.setDefaultConnectionConfig(getConnectionConfig())
154166
.setDefaultSocketConfig(getSocketConfig())

application-http-client/src/main/java/ru/art/http/client/constants/HttpClientModuleConstants.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,11 @@ public interface HttpClientModuleConstants {
2525
String TRACE_ID_HEADER = "X-Trace-Id";
2626
int DEFAULT_HTTP_CLIENT_TIMEOUT = 10000;
2727
int RESPONSE_BUFFER_DEFAULT_SIZE = 4096;
28+
int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 2;
29+
int DEFAULT_MAX_CONNECTIONS_TOTAL = 20;
30+
31+
enum HttpClientKeepAliveHeaderStrategy {
32+
IGNORE,
33+
CONSIDER
34+
}
2835
}

application-http-client/src/main/java/ru/art/http/client/factory/HttpClientsFactory.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class HttpClientsFactory {
4040
@SuppressWarnings("Duplicates")
4141
public static CloseableHttpAsyncClient createAsyncHttpClient(HttpClientConfiguration configuration) {
4242
HttpAsyncClientBuilder clientBuilder = HttpAsyncClients.custom()
43+
.setMaxConnPerRoute(configuration.getMaxConnectionsPerRoute())
44+
.setMaxConnTotal(configuration.getMaxConnectionsTotal())
4345
.setDefaultRequestConfig(configuration.getRequestConfig())
4446
.setDefaultIOReactorConfig(configuration.getIoReactorConfig())
4547
.setDefaultConnectionConfig(configuration.getConnectionConfig());
@@ -67,6 +69,8 @@ public static CloseableHttpAsyncClient createAsyncHttpClient(HttpClientConfigura
6769
@SuppressWarnings("Duplicates")
6870
public static CloseableHttpClient createHttpClient(HttpClientConfiguration configuration) {
6971
HttpClientBuilder clientBuilder = HttpClients.custom()
72+
.setMaxConnPerRoute(configuration.getMaxConnectionsPerRoute())
73+
.setMaxConnTotal(configuration.getMaxConnectionsTotal())
7074
.setDefaultRequestConfig(configuration.getRequestConfig())
7175
.setDefaultConnectionConfig(configuration.getConnectionConfig())
7276
.setDefaultSocketConfig(configuration.getSocketConfig())

0 commit comments

Comments
 (0)