Camel RabbitMQ使用者:concurrentConsumers和threadPoolSize选项之间的交互是什么?

时间:2016-02-11 09:05:23

标签: java multithreading configuration apache-camel rabbitmq

Camel RabbitMQ component允许设置选项concurrentConsumersthreadPoolSize。他们的描述和默认值如下:

  

concurrentConsumers - 默认值1 - 并发使用者数量   从经纪人那里消费时。 (例如类似于相同的选项   JMS组件)。

     

threadPoolSize - 默认10 - 消费者使用线程池   具有固定线程数的执行程序。此设置允许您   设置那个线程数。

有人可以解释这两者是如何互动的,特别是从表现的角度来看?

特别是,进入细微差别:

  1. 他们大致可以互换吗?即大概是2个消费者,5个线程~5个消费者,2个线程?
  2. 每个并发使用者是否获得threadPoolSize中指定的线程数,或者这些线程是否在所有并发使用者之间共享?
  3. 非常感谢!

2 个答案:

答案 0 :(得分:5)

我在我的机器上做了一些测试,这就是我得到的(我没有通过文档,所以我可能错了):

1。我注意到,消费者数量是您将附加到队列的“侦听器”数量(他们可以接收消息,但将处理委派给工作线程)。线程数是实际处理消息的工作者数量。

测试1: 使用1个线程,10个消费者和10个消息,您将同时“传递”(但未执行)10条消息,其中1个工作线程一次处理。

测试2: 使用10个线程,1个消费者和10个消息,您还将同时处理1条消息,但在处理消息时,其他消息在队列中可用(一次只传送1个消息),因此如果另一个侦听器附加消息,它将能够处理剩余的消息(不是第一个例子中的情况)。

<强> 2 我认为线程是共享的,因为如果不是这样的话,在测试1中,10个消息将被并行消耗(每个消费者总共10个线程的1个线程,而不仅仅是1个),这不是发生的事情。

我希望这有帮助!

答案 1 :(得分:1)

下面:

RabbitMQ组件对每个Camel(非RabbitMQ)使用者使用单个RabbitMQ Connection。这意味着如果你有5个camel-rabbitmq消费者,Camel将打开5个连接,每个连接都有一个大小为threadPoolSize的线程池,而不管concurrentConsumers参数。