Just do this quick test: from("direct:start").loop(20).to("restlet:http://<anyURL>");
you will get this exception because connections aren't closed until they are read from: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:412) at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:298) at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:238) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423) at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339) at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105) at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119) at org.restlet.Client.handle(Client.java:153) at org.restlet.Restlet.handle(Restlet.java:275) at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:79) at org.apache.camel.component.restlet.RestletProducer.process(RestletProducer.java:98) at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:468) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) at org.apache.camel.processor.LoopProcessor.process(LoopProcessor.java:128) at org.apache.camel.processor.LoopProcessor.process(LoopProcessor.java:96) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:468) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62) at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:468) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) at org.apache.camel.processor.Pipeline.process(Pipeline.java:121) at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190) at org.apache.camel.component.netty4.handlers.ServerChannelHandler.processAsynchronously(ServerChannelHandler.java:138) at org.apache.camel.component.netty4.handlers.ServerChannelHandler.channelRead0(ServerChannelHandler.java:109) at org.apache.camel.component.netty4.http.handlers.HttpServerChannelHandler.channelRead0(HttpServerChannelHandler.java:211) at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) at org.apache.camel.component.netty4.http.handlers.HttpServerMultiplexChannelHandler.channelRead0(HttpServerMultiplexChannelHandler.java:113) at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:307) at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:32) at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:298) at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:36) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) at java.lang.Thread.run(Thread.java:745) ________________________________________ From: Claus Ibsen <claus.ib...@gmail.com> Sent: Friday, May 13, 2016 7:55 AM To: users@camel.apache.org Subject: Re: Restlet GET request can cause Memeory leak/Stream not closed due to CAMEL-9611 Hi It seems wrong what you are doing as a workaround. You must have something that creates the message body as a connection/stream that should be responsible for closing it when its done being routed in Camel. So it smells like you should look at the route consumer. What are you using? On Fri, May 13, 2016 at 12:03 PM, J- <jmand...@hotmail.com> wrote: > My apologies, this bug is 100% my fault because of CAMEL-9611. > Jira is in some weird locked down state so i can't post the issue on there, > but this is pretty major. > > The fact that we no longer read the message body for Restlet GET request has > created a very painful bug (that took me 3 days to figure out). > The problem is that if body is never read and the body is a > connection/stream, it is never closed. > > To reproduce just call restlet GET 20 times in a row. > > from("direct:start").loop(20).to("restlet:http://<anyURL>?restletMethod=get"); > > Simpiliest fix for me was to read the body and dump it for the GET path in > DefaultRestletBinding.java > > @line 220: > else { > // no body > // dump body to close streams > try{ > String garbage = exchange.getIn().getBody(String.class); > }catch(Exception ex){ > //we don't care if this fails > } > LOG.debug("Populate Restlet {} request from exchange using > media type {}", method, mediaType); > request.setEntity(new EmptyRepresentation()); > } -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2