Hi,

I have a problem with RecipientList pattern. I'm using it in a parallel
processing mode which means it is backed up by a thread pool. The
configuration is as follows:

<threadPool id="pool" threadName="My RecipientList" poolSize="10"
maxPoolSize="200" />

<recipientList id="bidderResponseGatherer"
strategyRef="gatherBidderResponses" parallelProcessing="true"
stopOnException="false" timeout="1000" ignoreInvalidEndpoints="true"
executorServiceRef="pool" >
    <header>RecipientsList</header>
</recipientList>

The problem is that pool threads aren't released properly sometimes. After
a few hours following the start of an application I can see using jstack
tool that some threads are stuck in a WAITING state:

"Camel (mainContext) thread #187456 - NettyOrderedWorker" daemon prio=10
tid=0x00007fb14c058000 nid=0x5564 waiting on condition [0x00007fb2472d0000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00007fb4dc319940> (a
java.util.concurrent.CountDownLatch$Sync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
        at
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994)
        at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303)
        at
java.util.concurrent.CountDownLatch.await(CountDownLatch.java:236)
        at
org.apache.camel.processor.MulticastProcessor.doProcessParallel(MulticastProcessor.java:327)
        at
org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:213)
        at
org.apache.camel.processor.RecipientList.sendToRecipientList(RecipientList.java:153)
        at
org.apache.camel.processor.RecipientList.process(RecipientList.java:112)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
        at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
        at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at
org.apache.camel.component.netty.handlers.ServerChannelHandler.processAsynchronously(ServerChannelHandler.java:136)
        at
org.apache.camel.component.netty.handlers.ServerChannelHandler.messageReceived(ServerChannelHandler.java:108)
        at
org.apache.camel.component.netty.http.handlers.HttpServerChannelHandler.messageReceived(HttpServerChannelHandler.java:199)
        at
org.apache.camel.component.netty.http.handlers.HttpServerMultiplexChannelHandler.messageReceived(HttpServerMultiplexChannelHandler.java:103)
        at
org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
        at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
        at
org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
        at
org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.doRun(ChannelUpstreamEventRunnable.java:43)
        at
org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:67)
        at
org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor$ChildExecutor.run(OrderedMemoryAwareThreadPoolExecutor.java:314)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)


Number of such threads grows gradually until the application isn't able to
respond to the requests. I've found very similar ticket in your Jira (
https://issues.apache.org/jira/browse/CAMEL-6717) but it is stated there
that the problem is in the 3rd party library mqtt-client. However, I'm not
using this library, I'm only using Netty to make http requests but still
see a very similar behaviour.

I've updated Apache Camel to the latest version 2.15.1 (from 2.12.2) as
suggested here
http://camel.465427.n5.nabble.com/Camel-Netty-ReadTimeout-event-not-trigerred-td5761676.html.
But this didn't help too. Also I've noticed that thread is becoming
unavailable after the timeout specified for the calls has been reached.
Although not every timeout leads to a thread leak.

Can you suggest what else can be checked? Am I missing something? Or may be
this is a bug in Camel?


-- 
 Alexander Ilyin
*tel: 856-874-8928 <856-874-8928>*  Director of Engineering
alexande...@madadsmedia.com  717 Fellowship Rd. Suite D
Mount Laurel, NJ 08054

Reply via email to