【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会怎么样?

【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问?

【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问?

【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问?

【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问?

【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问?

【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问?

回答

首先taskExecutororg.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的taskExecutorSimpleAsyncTaskExecutor, 如果你使用默认的taskExecutor是不需要poolSize这个参数的, 那你如果指定taskExecutorThreadPoolTaskExecutor, 那poolSize就是指定这个线程池的大小, 后者和前者的区别就是, 前者是每次execute()都新建一个线程, 后者是用的线程池.

那也可以看出poolSizeconcurrency没有什么必然的关系了.

那针对你的问题, 如果要说有关系, 就是如果SimpleMessageListenerContainer中的taskExecutorThreadPoolTaskExecutor, 那么concurrency表示ThreadPoolTaskExecutor这个线程池要处理的任务数量.

那如果在SimpleMessageListenerContainer使用ThreadPoolTaskExecutor, 对于你问题中如果concurrency > poolSize会怎样, 就要看具体情况了, 比如你提到的poolSize大小啊, workQueue是什么啊, rejectedExecutionHandler是什么啊之类的.

以上是 【Java】spring的rabbitMq配置中参数pool-size和concurrency的疑问? 的全部内容, 来源链接: utcz.com/a/86834.html

回到顶部