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. >
