Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 驼峰分割EIP和池中线程的使用不';Don’’我好像不太明白_Java_Multithreading_Concurrency_Apache Camel_Threadpool - Fatal编程技术网

Java 驼峰分割EIP和池中线程的使用不';Don’’我好像不太明白

Java 驼峰分割EIP和池中线程的使用不';Don’’我好像不太明白,java,multithreading,concurrency,apache-camel,threadpool,Java,Multithreading,Concurrency,Apache Camel,Threadpool,我正在使用ApacheCamel 2.15,发现了一个有趣的行为。 我将通过RESTAPI调用接收到的数据放入作为直接端点的驼峰路由中。该路由依次使用拆分EIP并调用另一个骆驼路由,该骆驼路由也是直接端点 下面是相关的Camel代码 from("direct:activationInputChannel").routeId("cbr_activation_route") // removed some processes .split(simple("${body}")) .paralle

我正在使用ApacheCamel 2.15,发现了一个有趣的行为。 我将通过RESTAPI调用接收到的数据放入作为直接端点的驼峰路由中。该路由依次使用拆分EIP并调用另一个骆驼路由,该骆驼路由也是直接端点

下面是相关的Camel代码

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

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

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

问题是
cbr\u激活\u项目\u路线
只有50个
ExchangesInflight
。数字50对应于为默认池设置的
poolSize
maxPoolSize
设置为500,
maxQueueSize
设置为1000(默认值)


该航线的机上交换数量从未超过最小池大小。即使有大量的请求排队,线程可用。当我将驼峰默认线程池中的
poolSize
更改为200时,
cbr\u activation\u item\u route
使用了新的最小值,并且有200个
ExchangesInflight
。即使有更多可用线程,甚至在负载下,Camel也不会使用超过最小值的线程

是否存在导致这种行为的环境或我可能缺少的东西?当最小值设置为50时,为什么Camel不在第一次测试运行中使用200个线程


谢谢

这是预期的行为。这与Camel本身无关,但通常与Java有关

如果您阅读链接的文档,其中会显示:

如果运行的线程超过corePoolSize但小于maximumPoolSize,则仅当队列已满时才会创建新线程


如果将
maxQueueSize
设置为1000,则必须在创建新线程之前创建1050个请求,最多200个。如果不希望请求排队,请尝试告诉Camel使用线程池执行器。

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

如果您想让您的TPE在到达“corePoolSize”之后的请求到达时添加更多线程,那么有一种稍微有点黑客味的方法可以实现这一点,因为Java调用BlockingQueue中的offer()方法来对请求进行排队。如果offer()方法返回false,它将创建一个新线程并调用执行器的rejectedExecutionHandler。可以重写offer()方法并创建自己版本的ThreadPool executor,该执行器可以根据负载调整线程数


我在这里找到了这样一个例子:

“此路线的机上交换次数从未超过最小池大小。”但随后您会说:“当我将池大小更改为200时,cbr\u激活\u项目\u路线有200个ExchangesInflight。”。对于我来说,问题是什么还不清楚。第一个测试将驼峰池设置为50分钟,最大500个线程。当Camel在第一条路线上有200个活动请求(机上交换)时,split只使用min50。似乎它应该抓住更多的线程,因为性能不是很好。我将min提高到200,然后拆分可以进行200次空中交换。如果最大值为500,我认为不必提高最小值来让Camel在这里使用更多线程。请在上面的问题中对此进行澄清(希望如此)。谢谢。我已经阅读了关于“ThreadPoolExecutor”的内容,我发现这是现在的预期行为。除此之外,我们的许多低性能(我们认为这与拆分EIP无法访问更多线程有关)是HTTP4组件的默认设置。原来默认的
connectionsPerRoute
是20,我们正在从拆分路由调用另一个REST服务。提高此值有很大帮助。:)
from("direct:activationItemEndPoint").routeId("cbr_activation_item_route")
.process(exchange -> this.doSomething(exchange))
// removed some processes