【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问?
在task:executor中配置了pool-size,在rabbit:listener-container中配置了concurrency,这两个值应该是什么关系?
https://emacsist.github.io/20...
这篇文章说concurrency>pool-size会报错,但是我并没有报错,如果concurrency>pool-size会怎么样?
回答
首先taskExecutor
在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer
中的作用是初始化consumer
监听来着rabbitmq的消息
SimpleMessageListenerContainer#doStart()
中有这样一段:
AsyncMessageProcessingConsumer processor = new AsyncMessageProcessingConsumer(consumer);taskExecutor.execute(processor);
processor
是一个Runnable
, 它实际就是调用的consumer#start()
, 可以看到, taskExecutor
是在初始化的时候执行的execute()
, 那taskExecutor
的作用其实就是去start
rabbitmq的basicConsume()
.
那对于你问题中两个参数的作用:
concurrency
:
它的作用是告诉SimpleMessageListenerContainer
需要用taskExecutor
初始化多少个consumer
poolSize
:
首先这个参数不是rabbitmq的配置参数, 是taskExecutor
的配置参数, 其次在SimpleMessageListenerContainer
中default的taskExecutor
是SimpleAsyncTaskExecutor
, 如果你使用默认的taskExecutor
是不需要poolSize
这个参数的, 那你如果指定taskExecutor
为ThreadPoolTaskExecutor
, 那poolSize
就是指定这个线程池的大小, 后者和前者的区别就是, 前者是每次execute()
都新建一个线程, 后者是用的线程池.
那也可以看出poolSize
和concurrency
没有什么必然的关系了.
那针对你的问题, 如果要说有关系, 就是如果SimpleMessageListenerContainer
中的taskExecutor
为ThreadPoolTaskExecutor
, 那么concurrency
表示ThreadPoolTaskExecutor
这个线程池要处理的任务数量.
那如果在SimpleMessageListenerContainer
使用ThreadPoolTaskExecutor
, 对于你问题中如果concurrency > poolSize
会怎样, 就要看具体情况了, 比如你提到的poolSize
大小啊, workQueue
是什么啊, rejectedExecutionHandler
是什么啊之类的.
以上是 【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问? 的全部内容, 来源链接: utcz.com/a/86834.html