第12篇 rabbitmq ConsumerWorkService源码分析

其实第9篇已经写了WorkPool 工作池 ,了解workPool里面源码,以及使用LinkedBlockingQueue源码,也算是对blocking队列熟悉, 这节熟悉WorkPool调用方ConsumerWorkService ,顾名思义就是消费者的工作服务,因为write一般是实时写操作,消费需要多个线程,顺便透露一下ConsumerWorkService还有一个ConsumerDispatcher 分发器,不同消息做不同分发,进入正题

  • ConsumerWorkService是一个final类,其实我们在定义类尽量约束更紧能用private,绝对不能用public, 同时类也是一样,如果明确这个类无法继承就定义final类

1、成员变量和常量

类型字段默认值含义
intMAX_RUNNABLE_BLOCK_SIZE16最大阻塞线程数
intDEFAULT_NUM_THREADS当前机器处理器数 * 2默认线程数量
ExecutorServiceexecutor线程执行器
booleanprivateExecutorfalse是否为私有执行器
WorkPool<Channel, Runnable>workPool工作池
intshutdownTimeoutfalse关闭超时间

2、构造方法

方法名描述
ConsumerWorkService(executor, threadFactory, queueingTimeout shutdownTimeout)privateExecutor =(executor=null);
如果没有传executor就是要固定DEFAULT_NUM_THREADS线程池
ConsumerWorkService(executor, threadFactory, shutdownTimeout)默认队列不超时

3、普通方法

方法名描述图示
void shutdown()清除workPool所有任务,同时确实是否关闭executor执行器,如果默认创建就直接shutdown,如果外面传过来就不处理
void stopWork(channel)关闭某个channel的任务
void registerKey(channel)注册某个channel,没有初始任务
void setUnlimited(channel unlimited)unlimited==true所有chanel的LinkedBlockingQueue容量变成 Integer.MAX, 否则所有容量变成1000 ( 这个可能有问题)
void addWork(channel runnable)向workpool 中添加任务,且里面是Runnable对象,可以作为开启线程使用1

3.1、图示

image-20210610212502404

  • 总结
    1. 向workpool添加工作任务
    2. 添加成功之后线程执行器就执行从workpool拉取准备好的通道的任务
    3. 一次默认取16条,如果有准备好的,就遍历每个任务
    4. 执行Runnable的run方法,不会创建新线程
    5. 执行完这批次,然后再去workpool是否还有准备好任务,如果还有继续 3步骤

4、总结

  • ConsumerWorkService就是对于WorkPool应用
  • 主要是添加任务以及开启线程executor 执行workPool准备好的任务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值