Jay mann created METAMODEL-606:
----------------------------------

             Summary: Multiple Restlet GET calls without reading body results 
in hanging connections and ConnectionPool timeout
                 Key: METAMODEL-606
                 URL: https://issues.apache.org/jira/browse/METAMODEL-606
             Project: Apache MetaModel
          Issue Type: Bug
            Reporter: Jay mann


On subsequest rest GET calls, the body is not closed before being replaced.

Shouldn't the existing body be closed (if it is a stream) before replacing it 
with something else? After multiple call this results in the connectionPool to 
be indefinitely full and this exception:



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


Possibly related to this CAMEL-9611 because GET request no longer read the 
body, therefore the stream stays open and httpclient does not close the 
connection.

streamCaching does fix the issue. 

Here is some sample code to recreate the issue, just browse to 
http://localhost:port/contextRoot/ABC/test

..setup restConfiguration

rest("/ABC")
.description("ABC Rest Service")
.consumes("application/json").produces("application/json")
.get("test")
.bindingMode(RestBindingMode.off)
.to("direct:ABC-start-2")
.get("hello")
.bindingMode(RestBindingMode.off)
.route().setBody(constant("HELLO"));
from("direct:ABC-start-2").loop(10).to("direct:service-twice");
from("direct:service-twice")
.to("restlet:http://localhost:8299/contextRoot/ABC/hello?throwExceptionOnFailure=false&restletMethod=get&connectTimeout=10000&socketTimeout=10000";)
.to("restlet:http://localhost:8299/contextRoot/ABC/hello?throwExceptionOnFailure=false&restletMethod=get&connectTimeout=10000&socketTimeout=10000";);



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to