京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

RocketMQ设置的ConsumeThreadMax无效,线程数只会达到ConsumeThreadMin值 ...

2022-6-8 10:01| 发布者: zhaojun917| 查看: 3541| 评论: 0

摘要: RocketMQ源码RocketMQ的线程池是ThreadPoolExecutor,线程池的核心线程数等于mq设置的最小线程数,线程池的最大线程数等于mq设置的最大线程数。即:ThreadPoolExecutor.corePoolSize == RocketMQ.consumeThreadMinTh ...


RocketMQ源码
 

RocketMQ的线程池是ThreadPoolExecutor,线程池的核心线程数等于mq设置的最小线程数,线程池的最大线程数等于mq设置的最大线程数。

即:ThreadPoolExecutor.corePoolSize == RocketMQ.consumeThreadMin

ThreadPoolExecutor.maximumPoolSize == RocketMQ.consumeThreadMax

所以问题变更为
ThreadPoolExecutor.maximumPoolSize不生效

ThreadPoolExecutor的实现逻辑是
当前线程数等于核心线程数,任务会被扔进队列里面,只有当队列满了,才会新起线程,进而达到最大线程数。

然而MQ在new队列的时候,并没有设置容量大小,所以是无界队列...基本是不会满的。

总结起来就是:

1.rocketMQ用的是ThreadPoolExecutor

2.ThreadPoolExecutor只有当任务队列满了才会启动大于核心线程数的新线程

3.rocketMQ传给ThreadPoolExecutor的队列是没设置容量的无界队列

4.所以任务队列基本不会满

5.所以ThreadPoolExecutor基本不会新建大于核心线程数的线程

6.所以rocketMQ设置的ConsumeThreadMax是无效的

ps:虽然实际线程数不会达到consumeThreadMax,但该值还是要大于consumeThreadMin,不然mq会判断为报错。

有关ThreadPoolExecutor的maximumPoolSize的逻辑:https://blog.csdn.net/daizzzzz/article/details/106642029 《ThreadPoolExecutor coreSize、maxPoolSize 的一个理解误区》

有关无界队列LinkedBlockingQueue:https://blog.csdn.net/joeyon1985/article/details/44591589《LinkedBlockingQueue》

关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 19:07 , Processed in 0.037118 second(s), 19 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部