diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java index 48f5b9947ce..9a6792920f3 100644 --- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java +++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java @@ -232,6 +232,7 @@ public class WebTargetImpl implements WebTarget { private Configurable configImpl; private UriBuilder uriBuilder; private WebClient targetClient; + private boolean threadSafeTargetClient; public WebTargetImpl(UriBuilder uriBuilder, @@ -310,7 +311,7 @@ public Builder request() { cxfFeature.initialize(clientCfg, clientCfg.getBus()); } // Start building the invocation - return new InvocationBuilderImpl(WebClient.fromClient(targetClient), + return new InvocationBuilderImpl(threadSafeTargetClient ? targetClient : WebClient.fromClient(targetClient), getConfiguration()); } private void setConnectionProperties(Map configProps, ClientConfiguration clientCfg) { @@ -361,6 +362,7 @@ private void initTargetClientIfNeeded(Map configProps) { } } targetClient = bean.createWebClient(); + threadSafeTargetClient = threadSafe; ClientImpl.this.baseClients.add(targetClient); } else if (!targetClient.getCurrentURI().equals(uri)) { targetClient.to(uri.toString(), false); @@ -470,7 +472,7 @@ public WebTarget resolveTemplatesFromEncoded(Map templatesMap) { private WebTarget newWebTarget(UriBuilder newBuilder) { WebClient newClient; if (targetClient != null) { - newClient = WebClient.fromClient(targetClient); + newClient = threadSafeTargetClient ? targetClient : WebClient.fromClient(targetClient); } else { newClient = null; } diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultithreadedClientTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultithreadedClientTest.java index de1a396f773..e8a0359ef1d 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultithreadedClientTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultithreadedClientTest.java @@ -27,10 +27,13 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; import jakarta.ws.rs.core.MultivaluedMap; import jakarta.ws.rs.core.Response; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.jaxrs.client.Client; +import org.apache.cxf.jaxrs.client.ClientProperties; import org.apache.cxf.jaxrs.client.JAXRSClientFactory; import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean; import org.apache.cxf.jaxrs.client.WebClient; @@ -77,6 +80,18 @@ public void testSimpleWebClient() throws Exception { runWebClients(client, 10, true, false); } + @Test + public void testWebTargetGC() throws Exception { + WebTarget target = ClientBuilder.newClient().target("http://localhost:" + PORT + "/bookstore/booksecho") + .property(ClientProperties.THREAD_SAFE_CLIENT_PROP, true); + + target.request().get().getStatus(); + + System.gc(); + + target.request().get().getStatus(); + } + @Test public void testSimpleProxy() throws Exception { BookStore proxy = JAXRSClientFactory.create("http://localhost:" + PORT, BookStore.class);