Hello,

Thanks for the reproducer, it really helped understanding the problem. And
it is a real problem, I've just opened
https://issues.apache.org/jira/browse/CAMEL-24811 and the PR
https://github.com/apache/camel/pull/26584 (currently in review) that fixes
it. Once merged, we'll backport the fix to the 4.18.x and 4.22.x
maintenance branches as well as main (4.23.0). The issue is that a
CompletableFuture is invoked into a void method, and nothing wait for it to
complete, therefore you are getting the response recycled by tomcat.
But there is a workaround that is kind of described in
https://camel.apache.org/components/4.22.x/servlet-component.html#_servlet_asynchronous_support
add
an executorRef init-param to your CamelHttpTransportServlet in web.xml,
pointing at an Executor bean registered in your Spring context. Keep
async=true and remove forceAwait (or set it to false).

Greetings,
Federico

Il giorno gio 17 set 2026 alle ore 16:28 Alistair Higdon <
[email protected]> ha scritto:

> Hi
>
> We are upgrading from Camel 2.24.2 to 4.21.0(4.22.0 has the same issue).
> We are also moving from Java 11 to Java 25, and we are moving from Tomcat 9
> to Tomcat 11 too.
>
> We have a service(single war) that exposes Soap and Rest endpoints, and
> runs in Tomcat.
>
> Our web.xml is configured to use CamelHttpTransportServlet async.
>
> After upgrading, if Rest is configured to use servlet, and if our Rest
> endpoint receives a couple of requests close together we get this stack
> trace.
>
> 17-Sept-2026 14:23:25.794|ERROR|:|CamelHttpTransportServlet:431 Error
> processing request
> java.lang.IllegalStateException: The response object has been recycled and
> is no longer associated with this facade
>         at
> org.apache.catalina.connector.ResponseFacade.checkFacade(ResponseFacade.java:427)
>         at
> org.apache.catalina.connector.ResponseFacade.isCommitted(ResponseFacade.java:190)
>         at
> org.apache.catalina.connector.ResponseFacade.setStatus(ResponseFacade.java:360)
>         at
> org.apache.camel.http.common.DefaultHttpBinding.doWriteResponse(DefaultHttpBinding.java:432)
>         at
> org.apache.camel.http.common.DefaultHttpBinding.writeResponse(DefaultHttpBinding.java:381)
>         at
> org.apache.camel.http.common.CamelServlet.afterProcess(CamelServlet.java:419)
>         at
> org.apache.camel.http.common.CamelServlet.lambda$tryAsyncProcess$0(CamelServlet.java:378)
>         at
> java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:884)
>         at
> java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:862)
>         at
> java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:531)
>         at
> java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2206)
>         at
> org.apache.camel.support.AsyncCallbackToCompletableFutureAdapter.done(AsyncCallbackToCompletableFutureAdapter.java:53)
>         at org.apache.camel.AsyncCallback.run(AsyncCallback.java:46)
>         at
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.doRun(DefaultReactiveExecutor.java:202)
>         at
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:192)
>         at
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.tryExecuteReactiveWork(DefaultReactiveExecutor.java:169)
>         at
> org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:143)
>         at
> org.apache.camel.impl.engine.DefaultReactiveExecutor.schedule(DefaultReactiveExecutor.java:54)
>         at
> org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.lambda$doRun$0(RedeliveryErrorHandler.java:1112)
>         at
> org.apache.camel.component.cxf.jaxws.CxfClientCallback.handleResponse(CxfClientCallback.java:75)
>         at
> org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:949)
>         at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1762)
>         at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:1238)
>         at
> org.apache.cxf.workqueue.AutomaticWorkQueueImpl$3.run(AutomaticWorkQueueImpl.java:414)
>         at
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
>         at
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
>         at
> org.apache.cxf.workqueue.AutomaticWorkQueueImpl$AWQThreadFactory$1.run(AutomaticWorkQueueImpl.java:347)
>         at java.base/java.lang.Thread.run(Thread.java:1474)
>
>
> A single request works fine.  If Rest is configured to use Jetty it doesnt
> error.
>
> As part of processing the rest call, we make Soap calls to other
> services.  Without the Soap call it also works fine.
>
> If I change the CamelHttpTransportServlet to not be async, or set
> forceAwait to be true, then the stack trace doesnt occur, but the return
> from the Rest call has a Content-Type of XML, and exposes more information
> than I would like about the internal workings of the service(Note using
> Jetty has the same effect).  See below for example response
>
> HTTP/1.1 200
> accept-encoding: gzip,deflate
> user-agent: Apache-HttpClient/4.5.5 (Java/17.0.12)
> ResponseContext:
> org.apache.cxf.message.Message.PROTOCOL_HEADERS={Accept=[*/*],
> accept-encoding=[gzip,deflate], Content-Length=[249],
> content-type=[text/xml;charset=UTF-8], date=[Thu, 17 Sep 2026 14:03:43
> GMT], gemsessionid=[49b82c67-0674-4cf1-85db-c8ab72bd8c72],
> host=[localhost:8888], includetaskswithnopermissiontoperform=[true],
> SOAPAction=["CamelRestServletIssueService"],
> user-agent=[Apache-HttpClient/4.5.5 (Java/17.0.12)]}
> ResponseContext: org.apache.cxf.transport.Conduit=conduit: class
> org.apache.cxf.transport.http.HttpClientHTTPConduit238686806target:
> http://localhost:8888/CamelRestServletIssueService/example
> ResponseContext: jakarta.xml.ws.http.response.code=null
> ResponseContext: org.apache.cxf.service.model.MessageInfo=[MessageInfo
> OUTPUT: {
> http://example.com/camelrestservletissueservice}CamelRestServletIssueServiceResponse
> ]
> ResponseContext: jakarta.xml.ws.wsdl.interface={
> http://example.com/camelrestservletissueservice}CamelRestServletIssueServicePort
> ResponseContext:
> org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@35b6d490
> ResponseContext: envelope.events=[[Stax Event #13]]
> ResponseContext: org.apache.cxf.headers.Header.list=[]
> ResponseContext: jakarta.xml.ws.wsdl.service={
> http://example.com/camelrestservletissueservice}CamelRestServletIssueServicePortService
> ResponseContext: schema-validation-enabled=NONE
> ResponseContext: body.events=[]
> ResponseContext: org.apache.cxf.ws.policy.AssertionInfoMap={}
> ResponseContext: org.apache.cxf.client=true
> ResponseContext: envelope.prefix=soap
> ResponseContext: jakarta.xml.ws.wsdl.operation={
> http://example.com/camelrestservletissueservice}CamelRestServletIssueService
> ResponseContext: jakarta.xml.ws.wsdl.port={
> http://example.com/camelrestservletissueservice}CamelRestServletIssueServicePortPort
> ResponseContext: jakarta.xml.ws.wsdl.description=
> http://localhost:8888/CamelRestServletIssueService/example?wsdl
> ResponseContext: org.apache.cxf.message.Message.ENCODING=UTF-8
> ResponseContext: org.apache.cxf.message.inbound=true
> ResponseContext: org.apache.cxf.message.Message.RESPONSE_CODE=200
> ResponseContext: Content-Type=text/xml;charset=UTF-8
> ResponseContext: body.prefix=soap
> Accept: */*
> SOAPAction: CamelRestServletIssueService
> Content-Type: text/xml;charset=UTF-8
> Transfer-Encoding: chunked
> Date: Thu, 17 Sep 2026 14:03:45 GMT
> Keep-Alive: timeout=20
> Connection: keep-alive
>
> {"example": "Output"}
>
>
> I have attached a zip containing two maven projects to try to show the
> issue(when both projects are running in tomcat just put this address in the
> browser/SoapUI or equivalent, 
> http://host:port/CamelRestServletIssue/rest/example).
> Although I can reproduce the issue with the stack trace when the
> CamelRestServletIssue service calls a Soap service from our project, I cant
> provide that Soap service, so I have provided CamelRestServletIssueService
> as a service thats called, and the stack trace doesnt occur using that(even
> though there is nothing obvious as to why).  What does happen in that
> instance though, is as soon as it has a return from the Soap service it
> returns to client who called the rest service without running the code in
> the route after(the code runs after it returns to the client).
>
> Again if I change the CamelHttpTransportServlet to not be async, or set
> forceAwait to be true it works, but the return from the Rest call has a
> Content-Type of XML, and exposes more information than I would like about
> the internal workings of the service as above.
>
> If forceAwait has to be true in 4.21.0 thats fine, but the mimeType being
> Xml, and extra data in the response is an issue for us.
>
> Any ideas?
>
>
> This email is sent on behalf of NEC Software Solutions UK Limited and its
> associated companies (together "NEC Software Solutions") and is strictly
> confidential and intended solely for the addressee(s). Full details of
> those companies can be found at
> https://www.necsws.com/group-company-details/ If you are not the intended
> recipient of this email you must: (i) not disclose, copy or distribute its
> contents to any other person nor use its contents in any way or you may be
> acting unlawfully; (ii) contact NEC Software Solutions immediately on 
> +44(0)1442
> 768445 <+44%201442%20768445> quoting the name of the sender and the
> addressee then delete it from your system. NEC Software Solutions has taken
> reasonable precautions to ensure that no viruses are contained in this
> email, but does not accept any responsibility once this email has been
> transmitted. You should scan attachments (if any) for viruses.
>

Reply via email to