[ 
https://issues.apache.org/jira/browse/CXF-8951?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17790577#comment-17790577
 ] 

Lars Ködderitzsch commented on CXF-8951:
----------------------------------------

Thanks [~reta] we'll have a look at this.

However, due to some reflection hacks to allow for PATCH methods with 
HttpURLConnection in cxf, this requires additional JVM args to be set in Java 
17+ ("--add-opens", "java.base/java.net=ALL-UNNAMED").
We are discussing internally atm if we are going to production with workaround 
stacked upon workaround, or if we fall back to cxf-3.5 - at least until Spring 
Boot 3.0 forces us to use the jakarta-enabled cxf-4.x

> Concurrent WebClient usage causes massive thread overhead
> ---------------------------------------------------------
>
>                 Key: CXF-8951
>                 URL: https://issues.apache.org/jira/browse/CXF-8951
>             Project: CXF
>          Issue Type: Bug
>          Components: Core, JAX-RS
>    Affects Versions: 3.6.2, 4.0.3
>            Reporter: Lars Ködderitzsch
>            Priority: Blocker
>         Attachments: cxf-connector-threads.zip
>
>
> Concurrent usage of Webclients causes massively more threads to be created in 
> cxf-3.6.x/4.x than before.
> Supposedly this results from introducing a new conduit implementation based 
> on the "new" java http client compared to HttpUrlConnection before.
> It seems that a new http client is created per requesting thread - and each 
> http client in turn creates an own pool of selector/worker threads.
> To demonstate I've attached a test project with several methods to test 
> different scenarios.
> Each tests launches a simple JAX-RS Server, configures/uses WebClients in 
> different configuration and submits 1000 requests via up to 100 parrallel 
> requestor threads.
> The number of live threads in the JVM instance if printed after each request. 
> Baseline is the number of threads used by the server instance + the 100 
> requesting threads.
>  
> singleClientInstanceWithNewConduit -> reuses a threadsafe client instance, 
> thread count rises to 700+ live threads
> singleClientInstanceWithOldConduit -> reuses a threadsafe client instance, 
> stays at about 200 threads
> clientPerRequestWithOldConduit     -> creates a client instance per request 
> (no closing!), keeps below 200 threads
> clientPerRequestWithNewConduit     -> creates a client instance per request 
> (no closing!), creates a runaway thread leak (!)
> clientPerRequestWithNewConduit is additionally interesting because current 
> documentation is not clear about whether client instances
> are required to be resource managed or not.
> It appears that closing clients was not required up until cxf-3.6.0 and 
> documentation actively encourages creating new "lightweight" client instances 
> on the fly (see Thread safety in 
> [https://cxf.apache.org/docs/jax-rs-client-api.html]).
> However, cxf-3.6+ implementation (and comments in CXF-8885) seem to suggest 
> that clients are in fact *not lightweight* (anymore?) but need to be closed, 
> when no longer used.
> But then in turn WebClient/Client does not even implement 
> Closeable/Autoclosable. So, it's all quite muddy - and there doesn't seem to 
> be a real consensus on the idiomatic usage of Webclients.
> It would be very nice if you could bring some clarity on this as well.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to