Mule 3.3.1直到成功丢失由于忙线程而导致的消息

时间:2013-11-01 14:38:55

标签: multithreading mule blocking

我有2个流程。 FlowA接收呼叫(htp-inbound)并将消息放在队列中。 FlowB从此队列中获取消息并进入直到成功的循环。直到成功拨打电话。

<flowA>
  <http-inbound/>
  <put message on queueA/>
</flowA>
<flowB>
  <jms:inbound queueA>
  <until-successful>
     <http-outbound/>
  </until-successful>
</flowB>

我在调试模式下使用断点运行此操作,在该断点处进行外拨调用直到成功。我看到每个调用都创建一个新线程(直到成功),直到我们达到15.第16次调用,因为线程池已满,所以在flowB的线程中继续执行。我看到另外16个flowB线程被创建了。之后,当flowA在队列中放置一条消息时,flowB将其拾起,但我无法弄清楚接下来的位置:(消息丢失了!它不是在尝试拨打任何电话。

我认为16是默认的线程池大小。

阻止成功后的预期行为是什么?当所有线程都忙时,我希望消息排队。

如果我需要重新解释这个问题,请告诉我。

我在调试模式下运行并且可能搞砸了......所以....请耐心等待我。

1 个答案:

答案 0 :(得分:1)

你是对的:16是Mule中的默认线程池大小。

消息不应该丢失:它应该在until-successful对象存储库中累积,等待其中一个线程再次可用时等待接收。

核心问题是until-successful使用默认工作管理器作为不可配置的线程配置文件。如果可以配置自定义线程配置文件,您可以为maxBufferSize定义一个非零值,然后累积消息而不是触发池耗尽操作(当然,直到缓冲区已满,但这是另一个问题)。

但就目前而言,真的没有出路。 until-successful修复了16个线程“if exhausted run”操作。

这是一个已知问题:请参阅此处的第1点https://www.mulesoft.org/jira/browse/MULE-7035请注意此JIRA。