gpt4 book ai didi

java - Camel Split EIP 和池中线程的使用似乎没有超过最小线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:43 24 4
gpt4 key购买 nike

我正在使用 Apache Camel 2.15 并发现了一个有趣的行为。我将通过 REST API 调用接收到的数据放入作为直接端点的 Camel 路由中。该路由又使用拆分的 EIP 并调用另一个也是直接端点的 Camel 路由。

这是相关的 Camel 代码的样子

from("direct:activationInputChannel").routeId("cbr_activation_route")
// removed some processes
.split(simple("${body}"))
.parallelProcessing()
.to("direct:activationItemEndPoint")
.end()
// removed some processes

from("direct:activationItemEndPoint").routeId("cbr_activation_item_route")
.process(exchange -> this.doSomething(exchange))
// removed some processes

直接端点的使用应该使调用同步并在同一线程上运行。正如预期的那样,split/parallelProcessing 的使用导致第二条路由在单独的线程上运行。拆分器使用默认线程池。

当我使用 jMeter 对应用程序运行一些负载测试时,我发现拆分路由正在成为瓶颈。通过使用 200 个线程的负载测试,我观察到 Tomcat http 线程池在 jConsole 中的 currentThreadCount 为 200。我还观察到 Camel 路线 cbr_activation_route 有 200 个 ExchangesInflight

enter image description here

问题是 cbr_activation_item_route 只有 50 个 ExchangesInflight。数字 50 对应于为默认池设置的 poolSizemaxPoolSize 设置为 500,maxQueueSize 设置为 1000(默认值)。

这条航线的机上交换数量从未超过最小池大小。即使有大量请求排队并且线程可用。当我将 Camel 默认线程池中的 poolSize 更改为 200 时,cbr_activation_item_route 使用新的最小值并具有 200 ExchangesInflight。看起来 Camel 不会使用比最小值更多的线程,即使有更多线程可用,甚至在负载下也是如此。

是否有导致此行为的设置或我可能遗漏的东西?当最小值设置为 50 时,Camel 为什么不在第一次测试运行中使用 200 个线程?

谢谢

最佳答案

同意 Frederico 关于 Java 线程池执行器行为的回答。它更愿意向队列中添加新请求,而不是在达到“corePoolSize”线程后创建更多线程。

如果您希望您的 TPE 在达到“corePoolSize”之后在请求到来时添加更多线程,则可以通过一种稍微复杂的方式来实现这一点,因为 Java 会调用 BlockingQueue 中的 offer() 方法来对请求进行排队要求。如果 offer() 方法返回 false,它会创建一个新线程并调用 Executor 的 rejectedExecutionHandler。可以覆盖 offer() 方法并创建您自己的 ThreadPool 执行程序版本,它可以根据负载扩展线程数。

我在这里找到了一个例子:https://github.com/kimchy/kimchy.github.com/blob/master/_posts/2008-11-23-juc-executorservice-gotcha.textile

关于java - Camel Split EIP 和池中线程的使用似乎没有超过最小线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37865994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com