【问题标题】:CAMEL thread lock on servicemixservicemix上的CAMEL线程锁定
【发布时间】:2018-09-29 05:20:09
【问题描述】:

我在 ServiceMix 中遇到了骆驼问题。

我通过camel-jetty,servicemix中的camel-recipentlist做webservice。 这个包性能很好,但是发生了资源锁和线程满。该系统每秒处理 40 个呼叫。

问题是池线程有时没有正确释放。后 在应用程序启动几个小时后,我可以看到使用 jstack 一些线程卡在 WAITING 状态的工具:

配置如下: - 服务混合 5.3.0 - 骆驼 2.13.2 - 使用组件(camel-jetty,camel-recipentlist based Spring DSL)

-来源

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

------------- 日志

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多行。

你能建议还有什么可以检查的吗?我错过了什么吗?或者可能 这是骆驼的一个错误?

【问题讨论】:

    标签: apache-camel apache-servicemix


    【解决方案1】:

    线程处于等待状态并不是异常,但30.000个线程已经很多了。

    您正在使用 recipientList :对于 x 和 y 的每个组合,您正在创建一个新的码头生产者。每个jetty生产者都有自己的线程池,camel在缓存中保存了最后创建的生产者:这里创建了大量的线程池和线程。

    您不需要收件人列表即可动态构建 URL。您可以使用标题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>
    

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 1970-01-01
      • 2011-07-06
      • 2015-09-22
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      相关资源
      最近更新 更多