【问题标题】:Mule 3.3.1 until-successful losing messages due to busy threadsMule 3.3.1 until-successful 由于线程繁忙而丢失消息
【发布时间】:2013-11-02 07:29:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: multithreading mule blocking


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 哦,我忘了提,我确实设置了持久对象存储,但我看不到那里有更多消息累积。我看到 31 条消息。
    • 嗯,好的,我需要尝试重现此内容以便给出更明智的答案。敬请期待。
    • 非常感谢大卫。当直到成功的线程都忙起来时,我希望“FlowB”只是将消息粘贴到对象存储中并继续(直到对象存储用尽),我没想到会产生另一组 Flow 线程来完成任务。将等待您的反馈。
    • 您的期望是正确的。这里可能存在错误。
    • 抱歉提供零碎信息 :( 我确实注意到 DefaultContent 用 DEFAULT_THREADING_PROFILE 实例化了一个 MuleWorkManager,这是一个 ImmutableThreadingProfileDEFAULT_POOL_EXHAUST_ACTION,这反过来等于 WHEN_EXHAUSTED_RUN,这会导致 @987654329 @CallerRunsPolicy cmets.... /**一个被拒绝任务的处理程序,直接在execute方法的调用线程中运行被拒绝的任务,除非executor已经被关闭,这种情况下任务被丢弃。
    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多