Andrey created CXF-9100:
---------------------------

             Summary: HttpClient-1-Worker-* thread leak when throwing exception 
in LoggingOutInterceptor and sending large SOAP message
                 Key: CXF-9100
                 URL: https://issues.apache.org/jira/browse/CXF-9100
             Project: CXF
          Issue Type: Bug
          Components: logging, Transports
    Affects Versions: 3.6.5, 4.1.0, 4.0.4
            Reporter: Andrey
         Attachments: image-2025-01-13-12-39-07-688.png, 
image-2025-01-13-12-40-36-534.png

Hello,

After upgrading from 3.5.3 to 3.6+ (tried 3.6.5, 4.0.4, 4.1.0) we have noticed 
a HttpClient-1-Worker-* thread leak. Screenshots from VisualVM in attachments.

How to reproduce:
 # register custom LogEventSender and LoggingOutInterceptor 
 # throw any exception in send() method
 # send SOAP message with body >4kb (default chunkingThreshold value for 
HTTPConduit)
 # repeat previous step N times
 # watch HttpClient-1-Worker-* threads count grow till 
RejectedExecutionException for JDK17 or OutOfMemoryError for JDK21 after 3984 
(in my case) threads

Possible workaround:
Configure chunkingThreshold with greater value

Example for Spring:
{code:java}
@Bean
fun httpConduitConfigurer(): HTTPConduitConfigurer {
    return HTTPConduitConfigurer { _, _, conduit ->
        val httpClientPolicy = HTTPClientPolicy()
        httpClientPolicy.chunkingThreshold = 16384
        conduit.setClient(httpClientPolicy)
    }
} {code}
 

I wrote a demo project for this case: 
https://github.com/AndChelp/cxf-thread-leak

You can run TestControllerTest#testCommonEndpoint and watch «HttpClient-1-* 
thread count: N» log. Or you can run it as Spring Application, send GET /common 
request and watch threads with any profiler.

The project also has a configured workaround on /workaround endpoint and test 
for it



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

Reply via email to