From d29ccbef7960155d0c03adb07b62f75f8e650cef Mon Sep 17 00:00:00 2001 From: "Brian M. Long" Date: Thu, 29 Jun 2023 10:31:42 -0400 Subject: [PATCH 1/2] added connect/read timeout configurability --- src/main/java/com/inteligr8/rs/Client.java | 7 +++++++ .../java/com/inteligr8/rs/ClientConfiguration.java | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/com/inteligr8/rs/Client.java b/src/main/java/com/inteligr8/rs/Client.java index 2da7a6e..b8507d2 100644 --- a/src/main/java/com/inteligr8/rs/Client.java +++ b/src/main/java/com/inteligr8/rs/Client.java @@ -14,6 +14,8 @@ */ package com.inteligr8.rs; +import java.util.concurrent.TimeUnit; + import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; @@ -82,6 +84,11 @@ public abstract class Client { ClientBuilder clientBuilder = ClientBuilder.newBuilder() .register(provider) .register(new LoggingFilter()); + + if (this.getConfig().getConnectTimeoutInMillis() != null) + clientBuilder.connectTimeout(this.getConfig().getConnectTimeoutInMillis(), TimeUnit.MILLISECONDS); + if (this.getConfig().getResponseTimeoutInMillis() != null) + clientBuilder.readTimeout(this.getConfig().getResponseTimeoutInMillis(), TimeUnit.MILLISECONDS); if (authFilter == null) authFilter = this.getConfig().createAuthorizationFilter(); diff --git a/src/main/java/com/inteligr8/rs/ClientConfiguration.java b/src/main/java/com/inteligr8/rs/ClientConfiguration.java index 48834b0..98b2fc2 100644 --- a/src/main/java/com/inteligr8/rs/ClientConfiguration.java +++ b/src/main/java/com/inteligr8/rs/ClientConfiguration.java @@ -119,6 +119,16 @@ public interface ClientConfiguration { } + + default Integer getConnectTimeoutInMillis() { + return null; + } + + default Integer getResponseTimeoutInMillis() { + return null; + } + + /** * @return true to enable Jackson UNWRAP_ROOT_VALUE feature; false otherwise. From 803d49e53edc6afdfca04c6fc50c1b738f66e418 Mon Sep 17 00:00:00 2001 From: "Brian M. Long" Date: Thu, 29 Jun 2023 10:45:55 -0400 Subject: [PATCH 2/2] added CXF-specific configurable connect/received timeout --- src/main/cxf/com/inteligr8/rs/ClientCxfImpl.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/cxf/com/inteligr8/rs/ClientCxfImpl.java b/src/main/cxf/com/inteligr8/rs/ClientCxfImpl.java index 05e685d..9350815 100644 --- a/src/main/cxf/com/inteligr8/rs/ClientCxfImpl.java +++ b/src/main/cxf/com/inteligr8/rs/ClientCxfImpl.java @@ -24,6 +24,8 @@ import org.apache.cxf.BusFactory; import org.apache.cxf.jaxrs.client.JAXRSClientFactory; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl; +import org.apache.cxf.transport.http.HTTPConduit; +import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -129,6 +131,17 @@ public class ClientCxfImpl extends Client { // so we need to create a CXF client WebClient client = WebClient.create(this.getConfig().getBaseUrl(), providersAndFilters); + if (this.getConfig().getConnectTimeoutInMillis() != null || this.getConfig().getResponseTimeoutInMillis() != null) { + HTTPConduit conduit = client.getConfiguration().getHttpConduit(); + HTTPClientPolicy policy = conduit.getClient(); + if (policy == null) + conduit.setClient(policy = new HTTPClientPolicy()); + if (this.getConfig().getConnectTimeoutInMillis() != null) + policy.setConnectionTimeout(this.getConfig().getConnectTimeoutInMillis()); + if (this.getConfig().getResponseTimeoutInMillis() != null) + policy.setReceiveTimeout(this.getConfig().getResponseTimeoutInMillis()); + } + if (!this.getConfig().isDefaultBusEnabled()) { // Some applications (like ACS) add interceptors to the default bus // those interceptors may treat all messages as SOAP messages (like ACS), resulting in ClassCastExceptions