1

我有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 是默认的线程池大小。

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

如果我需要改写问题,请告诉我。

我在调试模式下运行,可能搞砸了……所以……请多多包涵。

4

1 回答 1

1

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

消息不应该丢失:它应该累积在until-successful对象存储中,等待线程之一再次可用时被拾取。

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

但就目前而言,真的没有出路。until-successful用 16 个线程修复了“如果用尽了运行”动作。

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

于 2013-11-01T14:52:04.497 回答