Java 驼峰分割EIP和池中线程的使用不';Don’’我好像不太明白
我正在使用ApacheCamel 2.15,发现了一个有趣的行为。 我将通过RESTAPI调用接收到的数据放入作为直接端点的驼峰路由中。该路由依次使用拆分EIP并调用另一个骆驼路由,该骆驼路由也是直接端点 下面是相关的Camel代码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
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