第13篇 rabbitmq ConsumerDispatcher源码分析

第9到12篇熟悉工作线程池和使用和触发工作线程池的服务ConsumerWorkService类,上面它们是不关心任务是什么,只管干活,那么谁知道是什么任务,或者受到rabbitmq服务器的消息,谁去判断是什么?有组装什么任务呢?这个就我们这篇要解析ConsumerDispatcher, 就是派发工作的包工头。

  • 它也是一个final修饰的普通类
  • 看类描述,它分派和通知内部管理执行器服务和工作池进行工作的,且每个通道有一个ConsumerDispatcher服务,你可以想象一下每个水管都套转接头, 但是执行服务和工作池是共享,我们熟悉WorkPool源码,Map的key就是channel, value具体任务。

1、成员变量

类型字段默认值含义
ConsumerWorkServiceworkService工作服务类
AMQConnectionconnection连接对象主要为了处理消费工作异常通知
Channelchannel通道
volatile booleanshuttingDownfalse多线程可见,是否关闭
volatile booleanshutdownConsumersDrivenfalse关闭消费者驱动
volatile CountDownLatchshutdownConsumersComplete关闭消费者完成多线程控制
volatile ShutdownSigalExceptionshutdownSignallnull发生异常信号通知

2、构造方法

  • 只有一个构造方法 ConsumerDispatcher(connection, channel, workService)
    • 在实例化ConsumerDispatcher将通道注册到WorkPool上

3、普通方法

方法名描述图示
void quiesce()shuttingDown=true, 表示这个通道正在关闭,不要往这个通道发消息了。
void setUnlimitedworkpool中value的队列是否无限,还有注意这个改变所有通道
void handleConsumeOk处理消费ok任务1
void handleCancelOk跟handleConsumerOk类似,第5点也是空实现(取消成功)
void handleCancel跟handleConsumerOk类似,第5点定义一个回调函数(执行取消操作)
void handleRecoverOk恢复成功
void handleDelivery处理传输的消息,收到消息具体操作,回调函数实现的
CountDownLatch handleShutdownSignal处理关闭信号2

3.1、图示

  1. handleConsumerOk

image-20210611110720517

  • 总结
    1. 判断是否shuttingDown状态
    2. 再一次检查是否有关闭异常信息
    3. 如果有异常信息就处理一下异常堆栈信息
    4. 没有就继续向workpool添加任务,workpool触发消费处理任务
    5. 处理实际逻辑
    6. 如果发现异常需要进行异常的处理逻辑
  1. handleShutdownSignal ( 处理关闭通道流程)
    • image-20210611114111259
  • 总结
    1. 创建一个CountDownLatch 确保 channel关闭完成之前处于阻塞状态
    2. 关闭这个通道所有消费者
    3. 设置关闭异常shutdownSigal
    4. 从WorkPool移除当前通道数据
    5. 放行,完成关闭操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值