【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的作用其实就是去startrabbitmq的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

