Camel RabbitMQ component允许设置选项concurrentConsumers
和threadPoolSize
。他们的描述和默认值如下:
concurrentConsumers
- 默认值1 - 并发使用者数量 从经纪人那里消费时。 (例如类似于相同的选项 JMS组件)。
threadPoolSize
- 默认10 - 消费者使用线程池 具有固定线程数的执行程序。此设置允许您 设置那个线程数。
有人可以解释这两者是如何互动的,特别是从表现的角度来看?
特别是,进入细微差别:
threadPoolSize
中指定的线程数,或者这些线程是否在所有并发使用者之间共享?非常感谢!
答案 0 :(得分:5)
我在我的机器上做了一些测试,这就是我得到的(我没有通过文档,所以我可能错了):
1。我注意到,消费者数量是您将附加到队列的“侦听器”数量(他们可以接收消息,但将处理委派给工作线程)。线程数是实际处理消息的工作者数量。
测试1: 使用1个线程,10个消费者和10个消息,您将同时“传递”(但未执行)10条消息,其中1个工作线程一次处理。
测试2: 使用10个线程,1个消费者和10个消息,您还将同时处理1条消息,但在处理消息时,其他消息在队列中可用(一次只传送1个消息),因此如果另一个侦听器附加消息,它将能够处理剩余的消息(不是第一个例子中的情况)。
<强> 2 强> 我认为线程是共享的,因为如果不是这样的话,在测试1中,10个消息将被并行消耗(每个消费者总共10个线程的1个线程,而不仅仅是1个),这不是发生的事情。
我希望这有帮助!
答案 1 :(得分:1)
下面:
concurrentConsumers
是Camel为您创建的competing native RabbitMQ consumers的数量。 Camel调用[channel.basicConsume()
](https://www.rabbitmq.com/releases/rabbitmq-java-client/v2.7.1/rabbitmq-java-client-javadoc-2.7.1/com/rabbitmq/client/Channel.html#basicConsume(java.lang.String,boolean,com.rabbitmq.client.Consumer))来创建每个消费者。
threadPoolSize
是creating a Connection from the ConnectionFactory
时RabbitMQ所需的ExecutorService
中的线程数。 Camel将为您创建此线程池。
RabbitMQ组件对每个Camel(非RabbitMQ)使用者使用单个RabbitMQ Connection
。这意味着如果你有5个camel-rabbitmq消费者,Camel将打开5个连接,每个连接都有一个大小为threadPoolSize
的线程池,而不管concurrentConsumers
参数。