第9到12篇熟悉工作线程池和使用和触发工作线程池的服务ConsumerWorkService类,上面它们是不关心任务是什么,只管干活,那么谁知道是什么任务,或者受到rabbitmq服务器的消息,谁去判断是什么?有组装什么任务呢?这个就我们这篇要解析ConsumerDispatcher, 就是派发工作的包工头。
- 它也是一个final修饰的普通类
- 看类描述,它分派和通知内部管理执行器服务和工作池进行工作的,且每个通道有一个ConsumerDispatcher服务,你可以想象一下每个水管都套转接头, 但是执行服务和工作池是共享,我们熟悉WorkPool源码,Map的key就是channel, value具体任务。
1、成员变量
类型 | 字段 | 默认值 | 含义 |
---|---|---|---|
ConsumerWorkService | workService | 工作服务类 | |
AMQConnection | connection | 连接对象主要为了处理消费工作异常通知 | |
Channel | channel | 通道 | |
volatile boolean | shuttingDown | false | 多线程可见,是否关闭 |
volatile boolean | shutdownConsumersDriven | false | 关闭消费者驱动 |
volatile CountDownLatch | shutdownConsumersComplete | 关闭消费者完成多线程控制 | |
volatile ShutdownSigalException | shutdownSignall | null | 发生异常信号通知 |
2、构造方法
- 只有一个构造方法 ConsumerDispatcher(connection, channel, workService)
- 在实例化ConsumerDispatcher将通道注册到WorkPool上
3、普通方法
方法名 | 描述 | 图示 |
---|---|---|
void quiesce() | shuttingDown=true, 表示这个通道正在关闭,不要往这个通道发消息了。 | |
void setUnlimited | workpool中value的队列是否无限,还有注意这个改变所有通道 | |
void handleConsumeOk | 处理消费ok任务 | 1 |
void handleCancelOk | 跟handleConsumerOk类似,第5点也是空实现(取消成功) | |
void handleCancel | 跟handleConsumerOk类似,第5点定义一个回调函数(执行取消操作) | |
void handleRecoverOk | 恢复成功 | |
void handleDelivery | 处理传输的消息,收到消息具体操作,回调函数实现的 | |
CountDownLatch handleShutdownSignal | 处理关闭信号 | 2 |
3.1、图示
- handleConsumerOk
- 总结
- 判断是否shuttingDown状态
- 再一次检查是否有关闭异常信息
- 如果有异常信息就处理一下异常堆栈信息
- 没有就继续向workpool添加任务,workpool触发消费处理任务
- 处理实际逻辑
- 如果发现异常需要进行异常的处理逻辑
- handleShutdownSignal ( 处理关闭通道流程)
- 总结
- 创建一个CountDownLatch 确保 channel关闭完成之前处于阻塞状态
- 关闭这个通道所有消费者
- 设置关闭异常shutdownSigal
- 从WorkPool移除当前通道数据
- 放行,完成关闭操作