From 635f8868fd91c08257c47db63c4cd2045c86b51a Mon Sep 17 00:00:00 2001 From: SristiSingh-eu Date: Tue, 27 Jan 2026 11:04:22 +0100 Subject: [PATCH] Add settcpNoDelay and setSokeepAlive --- .../client/config/ClientConnectionConfig.java | 14 ++++++++++++-- .../client/config/ConnectionConfigBuilder.java | 4 ++++ .../client/config/EntityClientConfiguration.java | 7 +++++++ .../resources/entity-client.properties.template | 3 +++ .../client/web/EntityClientInstantiationTest.java | 4 ++-- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/europeana/entity/client/config/ClientConnectionConfig.java b/src/main/java/eu/europeana/entity/client/config/ClientConnectionConfig.java index 381a0eb..4e99cf6 100644 --- a/src/main/java/eu/europeana/entity/client/config/ClientConnectionConfig.java +++ b/src/main/java/eu/europeana/entity/client/config/ClientConnectionConfig.java @@ -24,6 +24,8 @@ public class ClientConnectionConfig { private String connectionRequestTimeout; + private boolean tcpNoDelay; + public ClientConnectionConfig() { } @@ -38,7 +40,8 @@ public ClientConnectionConfig() { * @param connectionRequestTimeout connectionRequestTimeout value in seconds */ public ClientConnectionConfig(String totalMaxConnection, String maxConnectionPerRoute, String validateAfterInactivity, - String timeToLive, String socketTimeout, String responseTimeout, String connectionRequestTimeout) { + String timeToLive, String socketTimeout, String responseTimeout, String connectionRequestTimeout, + boolean tcpNoDelay) { this.totalMaxConnection = totalMaxConnection; this.maxConnectionPerRoute = maxConnectionPerRoute; this.validateAfterInactivity = validateAfterInactivity; @@ -46,6 +49,7 @@ public ClientConnectionConfig(String totalMaxConnection, String maxConnectionPer this.socketTimeout = socketTimeout; this.responseTimeout = responseTimeout; this.connectionRequestTimeout = connectionRequestTimeout; + this.tcpNoDelay = tcpNoDelay; } public int getTotalMaxConnection() { @@ -104,6 +108,10 @@ public void setConnectionRequestTimeout(String connectionRequestTimeout) { this.connectionRequestTimeout = connectionRequestTimeout; } + public boolean getTcpNoDelay() { + return tcpNoDelay; + } + /** * Checks if pooling connection property values are provided * @return true @@ -120,7 +128,9 @@ public boolean hasPoolingConnMetadata() { * @return true */ public boolean hasIOReactorMetadata() { - return StringUtils.isNotBlank(this.socketTimeout); + return StringUtils.isNotBlank(this.socketTimeout) + || this.tcpNoDelay; + } /** diff --git a/src/main/java/eu/europeana/entity/client/config/ConnectionConfigBuilder.java b/src/main/java/eu/europeana/entity/client/config/ConnectionConfigBuilder.java index 825d1e7..312577a 100644 --- a/src/main/java/eu/europeana/entity/client/config/ConnectionConfigBuilder.java +++ b/src/main/java/eu/europeana/entity/client/config/ConnectionConfigBuilder.java @@ -66,11 +66,15 @@ public static IOReactorConfig buildIOReactorConfig(EntityClientConfiguration con if (config != null && config.hasIOReactorMetadata()) { return IOReactorConfig.custom() .setSoTimeout(Timeout.of(config.getConnectionConfigValue(SOCKET_TIMEOUT), TimeUnit.SECONDS)) + .setTcpNoDelay(config.getTcpNoDelay()) + .setSoKeepAlive(true) .build(); } if (connConfig != null && connConfig.hasIOReactorMetadata()) { return IOReactorConfig.custom() .setSoTimeout(Timeout.of(connConfig.getSocketTimeout(), TimeUnit.SECONDS)) + .setTcpNoDelay(connConfig.getTcpNoDelay()) + .setSoKeepAlive(true) .build(); } return IOReactorConfig.custom().build(); // default diff --git a/src/main/java/eu/europeana/entity/client/config/EntityClientConfiguration.java b/src/main/java/eu/europeana/entity/client/config/EntityClientConfiguration.java index 964a88c..e5ddf9e 100644 --- a/src/main/java/eu/europeana/entity/client/config/EntityClientConfiguration.java +++ b/src/main/java/eu/europeana/entity/client/config/EntityClientConfiguration.java @@ -34,6 +34,8 @@ public class EntityClientConfiguration extends AuthenticationConfig { public static final String CONNECTION_REQUEST_TIMEOUT = "entity.client.connection.request.timeout"; public static final String RESPONSE_TIMEOUT = "entity.client.response.timeout"; + public static final String TCP_NO_DELAY = "entity.client.tcp.no.delay"; + /** * Constructor @@ -116,6 +118,11 @@ public String getResponseTimeout() { return getProperty(RESPONSE_TIMEOUT); } + public boolean getTcpNoDelay() { + return Boolean.parseBoolean(getProperty(TCP_NO_DELAY)); + } + + /** * return the Integer value of the property requested * @return value diff --git a/src/main/resources/entity-client.properties.template b/src/main/resources/entity-client.properties.template index 9466f48..14ed426 100644 --- a/src/main/resources/entity-client.properties.template +++ b/src/main/resources/entity-client.properties.template @@ -27,3 +27,6 @@ entity.client.time.to.live=60 entity.client.socket.timeout=300 entity.client.connection.request.timeout=30 entity.client.response.timeout=60 + +## controls if Nagle's algorithm is enabled or disabled on a TCP socket. +entity.client.tcp.no.delay=true diff --git a/src/test/java/eu/europeana/entity/client/web/EntityClientInstantiationTest.java b/src/test/java/eu/europeana/entity/client/web/EntityClientInstantiationTest.java index 622bfed..c36e59a 100644 --- a/src/test/java/eu/europeana/entity/client/web/EntityClientInstantiationTest.java +++ b/src/test/java/eu/europeana/entity/client/web/EntityClientInstantiationTest.java @@ -74,7 +74,7 @@ public void testEntityClient_withConnectionConfiguration() throws EntityClientEx , new ApikeyBasedAuthentication("invalid_test"), new ClientConnectionConfig("25", "5", "5", "60", "300", - "30", "60")); + "30", "60", true)); Assertions.assertNotNull(entityClientApi); Assertions.assertEquals(ApikeyBasedAuthentication.class, entityClientApi.getEntityClientApiConnection().getAuthenticationHandler().getClass()); @@ -109,7 +109,7 @@ public void testEntityClient_withEntityConfiguration_AndConnectionConfig() throw EntityApiClient entityClientApi = new EntityApiClient(new EntityClientConfiguration(properties), new ClientConnectionConfig("25", "5", "5", "60", "300", - "30", "60")); + "30", "60", false)); Assertions.assertNotNull(entityClientApi); Assertions.assertEquals(ApikeyBasedAuthentication.class, entityClientApi.getEntityClientApiConnection().getAuthenticationHandler().getClass());