我有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是默认的线程池大小。
阻止成功后的预期行为是什么?当所有线程都忙时,我希望消息排队。
如果我需要重新解释这个问题,请告诉我。
我在调试模式下运行并且可能搞砸了......所以....请耐心等待我。
答案 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。