我在ServiceMix中遇到了驼峰问题。
我通过servicemix中的camel-jetty,camel-recipentlist创建了webservice。 这个包是很好的性能,但资源锁和线程已满。该系统每秒进行40次呼叫。
问题是池线程有时不能正确释放。后 在应用程序启动几个小时后,我可以看到使用jstack 某些线程处于等待状态的工具:
配置如下: - servicemix 5.3.0 - 骆驼2.13.2 - 使用组件(camel-jetty,基于Camel-recipentlist的Spring DSL)
-SOURCE
<route customId="true" >
<from uri="direct:giop_addr_async">
<recipentList>
<simple>jetty://http://api.host.lm?x=${header.x}&y=${header.y}</simple>
</recipentList>
<bean ref="soapDecode" method="userDecode"/>
<to uri="direct:sendEndPoint">
</route>
<route customId="true>
<from uri="direct:sendEndPoint">
<to uri="jetty://http://resultMap?httpClient.soTimeout=80000"/>
</route>
-------------- LOG
ps -eLf | wc -l --> 32500
"CamelJettyClient(0x3d0b240d)-26916" damen prio=10 tid=0x000000000ff69800 nid =0x10ef wating on condition [0x00002b4b3ba3f0000]
java.lang.Thread.State: TIMED_WAITNG(parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000006f13f19b0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LocsSupport.parkNanos(LockSupport,java:226)
at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:342)
at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoss(QueuedThreadPool.java:526)
at org.eclipse.jetty.tuil.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
at java.lnag.thread.run(Thread.java:745)
以上日志超过30000行。
你能说一下还能检查什么吗?我错过了什么吗?或者可能 这是骆驼的一个错误?
答案 0 :(得分:0)
线程处于等待状态并不是异常,但是30.000线程很多。
您正在使用recipientList
:对于x和y的每个组合,您正在创建一个新的码头生产者。每个jetty生成器都有自己的线程池,并且camel会在最后一个生成器创建的缓存中保存:这里创建了大量的线程池和线程。
您无需使用recipientList即可动态构建网址。您可以使用标题Exchange.HTTP_URI
:
例如:
<route customId="true" >
<from uri="direct:giop_addr_async">
<setHeader headerName="CamelHttpUri">
<simple>jetty://http://api.host.lm?x=${header.x}&y=${header.y}</simple>
</setHeader>
<to uri="jetty://http://api.host.lm"/>
<bean ref="soapDecode" method="userDecode"/>
<to uri="direct:sendEndPoint">
</route>
<route customId="true>
<from uri="direct:sendEndPoint">
<to uri="jetty://http://resultMap?httpClient.soTimeout=80000"/>
</route>