Skip to content

Commit ce2c506

Browse files
author
Anton Bashirov
authored
Merge pull request #273 from art-community/feature/keep-alive
Feature/keep alive
2 parents 42b2070 + 01847fd commit ce2c506

File tree

12 files changed

+71
-1
lines changed

12 files changed

+71
-1
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ static GrpcCommunicator grpcCommunicator(String host, int port, String path) {
6464

6565
GrpcCommunicator secured();
6666

67+
GrpcCommunicator keepAliveTimeNanos(long time);
68+
69+
GrpcCommunicator keepAliveTimeOutNanos(long timeOut);
70+
71+
GrpcCommunicator keepAliveWithoutCalls(boolean keepAliveWithoutCalls);
72+
6773
void shutdownChannel();
6874

6975
GrpcAsynchronousCommunicator asynchronous();

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,15 @@ public class GrpcCommunicatorImplementation implements GrpcCommunicator, GrpcCom
6868
GrpcCommunicatorImplementation(GrpcCommunicationTargetConfiguration targetConfiguration) {
6969
configuration.setPath(validator.notEmptyField(targetConfiguration.path(), "path"));
7070
deadlineTimeout(targetConfiguration.timeout());
71+
keepAliveTimeNanos(targetConfiguration.keepAliveTimeNanos());
72+
keepAliveTimeNanos(targetConfiguration.keepAliveTimeOutNanos());
73+
keepAliveWithoutCalls(targetConfiguration.keepAliveWithoutCalls());
7174
if (targetConfiguration.secured()) {
7275
secured();
7376
}
77+
if (targetConfiguration.waitForReady()) {
78+
waitForReady();
79+
}
7480
if (isNotEmpty(targetConfiguration.url())) {
7581
configuration.setUrl(targetConfiguration.url());
7682
return;
@@ -141,6 +147,24 @@ public GrpcCommunicator secured() {
141147
return this;
142148
}
143149

150+
@Override
151+
public GrpcCommunicator keepAliveTimeNanos(long time) {
152+
configuration.setKeepAliveTimeNanos(time);
153+
return this;
154+
}
155+
156+
@Override
157+
public GrpcCommunicator keepAliveTimeOutNanos(long timeOut) {
158+
configuration.setKeepAliveTimeNanos(timeOut);
159+
return this;
160+
}
161+
162+
@Override
163+
public GrpcCommunicator keepAliveWithoutCalls(boolean keepAliveWithoutCalls) {
164+
configuration.setKeepAliveWithoutCalls(keepAliveWithoutCalls);
165+
return null;
166+
}
167+
144168
@Override
145169
public void shutdownChannel() {
146170
ManagedChannel channel = this.channel.safeValue();

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ class HttpCommunicationConfiguration {
5656
private HttpCommunicationCancellationHandler<?> cancellationHandler;
5757
private boolean chunkedBody;
5858
private boolean gzipCompressedBody;
59-
private ConnectionClosingPolicy connectionClosingPolicy = CLOSE_AFTER_RESPONSE;
6059
private RequestConfig requestConfig = httpClientModule().getRequestConfig();
6160
private HttpVersion httpProtocolVersion = httpClientModule().getHttpVersion();
6261
private MimeToContentTypeMapper producesMimeType = httpClientModule().getProducesMimeTypeMapper();
@@ -68,4 +67,6 @@ class HttpCommunicationConfiguration {
6867
private CloseableHttpAsyncClient asynchronousClient;
6968
private List<ValueInterceptor<Value, Value>> requestValueInterceptors = linkedListOf(httpClientModule().getRequestValueInterceptors());
7069
private List<ValueInterceptor<Value, Value>> responseValueInterceptors = linkedListOf(httpClientModule().getResponseValueInterceptors());
70+
private ConnectionClosingPolicy connectionClosingPolicy = CLOSE_AFTER_RESPONSE;
71+
private boolean enableKeepAlive;
7172
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@
5353
import static ru.art.http.client.builder.HttpUriBuilder.*;
5454
import static ru.art.http.client.constants.HttpClientExceptionMessages.*;
5555
import static ru.art.http.client.constants.HttpClientModuleConstants.ConnectionClosingPolicy.CLOSE_AFTER_RESPONSE;
56+
import static ru.art.http.client.constants.HttpClientModuleConstants.HTTP_HEADER_CONNECTION_CLOSE;
57+
import static ru.art.http.client.constants.HttpClientModuleConstants.HTTP_HEADER_CONNECTION_KEEP_ALIVE;
5658
import static ru.art.http.client.module.HttpClientModule.*;
59+
import static ru.art.http.constants.HttpHeaders.CONNECTION;
5760
import static ru.art.http.constants.HttpHeaders.KEEP_ALIVE;
5861
import static ru.art.logging.LoggingModule.*;
5962
import javax.annotation.*;
@@ -159,6 +162,7 @@ private static HttpUriRequest buildRequest(HttpCommunicationConfiguration config
159162
.setCharset(configuration.getRequestContentCharset())
160163
.setVersion(configuration.getHttpProtocolVersion());
161164
configuration.getHeaders().forEach(requestBuilder::addHeader);
165+
requestBuilder.addHeader(CONNECTION, configuration.isEnableKeepAlive() ? HTTP_HEADER_CONNECTION_KEEP_ALIVE : HTTP_HEADER_CONNECTION_CLOSE);
162166
if (isNull(request)) {
163167
return requestBuilder.build();
164168
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ static HttpCommunicator httpCommunicator(HttpCommunicationTargetConfiguration ta
9696

9797
HttpCommunicator requestEncoding(String encoding);
9898

99+
HttpCommunicator enableKeepAlive();
100+
99101
<RequestType, ResponseType> Optional<ResponseType> execute(RequestType request);
100102

101103
<ResponseType> Optional<ResponseType> execute();
@@ -108,6 +110,7 @@ static HttpCommunicator httpCommunicator(HttpCommunicationTargetConfiguration ta
108110

109111
HttpAsynchronousCommunicator asynchronous();
110112

113+
111114
interface HttpAsynchronousCommunicator {
112115
void closeAsynchronousClient();
113116

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,12 @@ public HttpCommunicator requestEncoding(String encoding) {
232232
return this;
233233
}
234234

235+
@Override
236+
public HttpCommunicator enableKeepAlive() {
237+
configuration.setEnableKeepAlive(true);
238+
return this;
239+
}
240+
235241
@Override
236242
public HttpCommunicator addRequestValueInterceptor(ValueInterceptor<Value, Value> interceptor) {
237243
configuration.getRequestValueInterceptors().add(validator.notNullField(interceptor, "requestValueInterceptor"));

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public interface HttpClientModuleConstants {
2929
int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 2;
3030
int DEFAULT_MAX_CONNECTIONS_TOTAL = 20;
3131
int DEFAULT_VALIDATE_AFTER_INACTIVITY_MILLIS = 4000;
32+
String HTTP_HEADER_CONNECTION_CLOSE = "Close";
33+
String HTTP_HEADER_CONNECTION_KEEP_ALIVE = "Keep-Alive";
3234

3335
enum ConnectionClosingPolicy {
3436
CLOSE_AFTER_RESPONSE,

application-soap-client/src/main/java/ru/art/soap/client/communicator/SoapCommunicationConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class SoapCommunicationConfiguration {
7575
private List<ValueInterceptor<XmlEntity, XmlEntity>> responseValueInterceptors = linkedListOf();
7676
private OperationIdSource operationIdSource = REQUEST;
7777
private ConnectionClosingPolicy connectionClosingPolicy = CLOSE_AFTER_RESPONSE;
78+
private boolean enableKeepAlive;
7879

7980
void validateRequiredFields() {
8081
boolean urlIsEmpty = isEmpty(url);

application-soap-client/src/main/java/ru/art/soap/client/communicator/SoapCommunicationExecutor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ static <RequestType, ResponseType> Optional<ResponseType> execute(SoapCommunicat
3939
configuration.getResponseInterceptors().forEach(httpCommunicator::addResponseInterceptor);
4040
configuration.getRequestValueInterceptors().forEach(interceptor -> httpCommunicator.addRequestValueInterceptor(cast(interceptor)));
4141
configuration.getResponseValueInterceptors().forEach(interceptor -> httpCommunicator.addResponseValueInterceptor(cast(interceptor)));
42+
if (configuration.isEnableKeepAlive()) {
43+
httpCommunicator.enableKeepAlive();
44+
}
4245
httpCommunicator
4346
.connectionClosingPolicy(configuration.getConnectionClosingPolicy())
4447
.version(configuration.getHttpVersion())
@@ -68,6 +71,9 @@ static <RequestType, ResponseType> CompletableFuture<Optional<ResponseType>> exe
6871
configuration.getRequestInterceptors().forEach(httpCommunicator::addResponseInterceptor);
6972
configuration.getRequestValueInterceptors().forEach(interceptor -> httpCommunicator.addRequestValueInterceptor(cast(interceptor)));
7073
configuration.getResponseValueInterceptors().forEach(interceptor -> httpCommunicator.addResponseValueInterceptor(cast(interceptor)));
74+
if (configuration.isEnableKeepAlive()) {
75+
httpCommunicator.enableKeepAlive();
76+
}
7177
httpCommunicator
7278
.connectionClosingPolicy(configuration.getConnectionClosingPolicy())
7379
.version(configuration.getHttpVersion())

application-soap-client/src/main/java/ru/art/soap/client/communicator/SoapCommunicator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ static SoapCommunicator soapCommunicator(HttpCommunicationTargetConfiguration ta
8585

8686
SoapCommunicator version(HttpVersion httpVersion);
8787

88+
SoapCommunicator enableKeepAlive();
89+
8890
<RequestType, ResponseType> Optional<ResponseType> execute(RequestType request);
8991

9092
SoapAsynchronousCommunicator asynchronous();

application-soap-client/src/main/java/ru/art/soap/client/communicator/SoapCommunicatorImplementation.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ public SoapCommunicator version(HttpVersion httpVersion) {
195195
return this;
196196
}
197197

198+
@Override
199+
public SoapCommunicator enableKeepAlive() {
200+
configuration.setEnableKeepAlive(true);
201+
return this;
202+
}
203+
198204
@Override
199205
public <RequestType, ResponseType> Optional<ResponseType> execute(RequestType request) {
200206
request = validator.notNullField(request, "request");

application-test/build.gradle.kts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
2+
import org.gradle.api.tasks.testing.logging.TestLogEvent.*
13
import ru.art.gradle.constants.lombok
24

35
/*
@@ -36,4 +38,11 @@ dependencies {
3638
annotationProcessor(lombok().inGradleNotation())
3739
testAnnotationProcessor(lombok().inGradleNotation())
3840
testImplementation("org.hsqldb", "hsqldb", "2+")
41+
}
42+
43+
tasks.withType<Test> {
44+
testLogging {
45+
events = setOf(PASSED, FAILED, SKIPPED)
46+
exceptionFormat = FULL
47+
}
3948
}

0 commit comments

Comments
 (0)