【问题标题】:Apache Camel split runs in parallell with ThreadPool, why?Apache Camel split 与线程池并行运行,为什么?
【发布时间】:2017-10-10 08:37:45
【问题描述】:

我有一个camelRoute,它应该在一个拆分中使用一个线程池来做并行工作。我的问题是我总是以一个线程结束太多,因为拆分将运行一个线程,线程池运行指定数量的线程。我希望线程池限制线程数量。

任何人都知道为什么会发生这种情况?下面的路线和骆驼上下文...(代码中的其他值,例如 from 和 id 等,但不能在这里显示...)

from(FROM_ENDPOINT)
    .routeId(ID)
    .split(body(), new GroupedExchangeAggregationStrategy())
    .executorServiceRef("ThreadPool")
    .bean(bean, "beanMethod")
    .end()
    .bean(bean)
    .multicast()
    .to(TO_ENDPOINT);

ThreadPool 在我的 camel-context.xml 中是这样配置的:

<camel:camelContext id="application-context" useMDCLogging="true" xmlns="http://camel.apache.org/schema/spring">
    <propertyPlaceholder id="properties" location="ref:props"/>
    <routeBuilder ref="refToRoute"/>
    <threadPoolProfile id="ThreadPool" maxPoolSize="2"
                       maxQueueSize="-1" poolSize="2"/>
</camel:camelContext>

【问题讨论】:

    标签: multithreading concurrency split apache-camel threadpool


    【解决方案1】:

    拆分器需要一个后台线程来协调并行工作。因此,您拥有线程池中的线程 + 一个名为 Splitter-AggregateTask 的额外线程。

    因此,如果您希望总共最多 10 个,则将线程池大小设置为 9,这样您也有空间容纳 1 个后台线程。

    【讨论】:

    • 谢谢,很高兴知道为什么我有一个额外的线程。我曾想过将线程池值设置为少一但如果我想使用 1 个线程运行呢?在测试中,只使用一个线程是有益的,因为我们在线程池日志中所做的工作是我们需要按顺序查看的值,并且并行流将使这很难遵循。我现在唯一的解决方案是从路由中删除线程池。
    • 对于 1 个线程然后不要使用线程池,然后它的所有顺序和相同的顺序。
    • 是的,我明白这一点,但由于调试,我希望在生产中使用线程池,但不在测试中。我不想要两个用于测试/生产的代码库,但我只想将线程池配置为在测试中使用 1 个线程,在生产中使用多个线程。但这可能是不可能的?
    • 确保使用属性占位符,这样您就可以拥有不同的属性文件用于测试和生产
    • 但这对我没有帮助。执行程序服务在路由中,即使我在我的属性文件中将线程降低到 1 或 0,也总会有 2 个线程。一个用于拆分,一个用于执行器服务。如果我想要 1 个线程,我必须从代​​码中完全删除“.executorServiceRef("ThreadPool")”(并重建)。
    猜你喜欢
    • 2019-12-29
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2019-09-21
    相关资源
    最近更新 更多