IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 第34篇 rabbitmq AMQChannel源码分析 -> 正文阅读

[大数据]第34篇 rabbitmq AMQChannel源码分析

上一篇稍微了解一下Channel, 本节我们来了解一下AMQChannel抽象类

image-20210615175209452

1、ShutdownNotifierComponent 类

  • 这个类是ShutdownListener监听器管理类,且会记录关闭的原因,这个是Channel和Connection都有关闭监听器。

1.1、成员变量或常量

类型和名称默认值含义
Object monitornew Object()同步锁
List shutdownListenersnew ArrayList()所有关闭监听器
volatile ShutdownSignalException shutdownCausenull关闭信号异常

1.2、方法

方法名描述
void addShutdownListener添加关闭监听器,如果有异常,直接执行关闭异常
ShutdownSingalException get CloseReason获取关闭异常
void notifyListeners通知关闭的消息
void removeShutdownListener移除关闭监听器
boolean isOpen判断是否打开, true表打开,false表示关闭
boolean setShutdownCauseIfOpen如果关闭设置异常的值(shutdownCause)

2、AMQChannel 抽象类

2.1、成员变量或常量

类型和名称默认值含义
int NO_RPC_TIMEOUT0rpc调用无超时时间
Object _channelMutexnew Object()
AMQConnection _connection这个通道关联连接对象
int _channelNumber通道数字编号
RpcWrapper _activeRpcnull当前未完成rpc请求,将来可能是队列
volatile boolean _blockContentfalse是否阻止内容传输
int _rpcTimeoutrpc超时时间
_checkRpcResponseType检查rpc响应类型
TrafficListener _trafficListener目前来说为调试,打印日志

2.2、方法

方法名描述图示
int getChannelNumber获取通道数字编号
void handleFrame处理从连接对象取出Frame对象,具体参考第6篇
IOException wrap包装成IO异常
AMQCommand exnWrappingRpc异常包装获取rpc数据1
CompletableFuture exnWrappingAsyncRpc(Method m)异步 包装异常获取rpc数据,exnWrappingRpc不同,这个方法是异步的,用CompletableFuture包装的
void handleCompleteInboundCommand(AMQCommand)处理没有经过异步处理command2
void processShutdownSignal处理关闭信号

2.3、图示

  1. AMQCommand exnWrappingRpc(Method m)

    • 方法就是发送请求,然后将异常包装成IO异常,上传图片,且是同步
    • image-20210712195733896
    1. 调用rpc方法
    2. 先判断是否关闭,也就是shutdownException是否有值
    3. 入队,其实抢通道的独占锁,_channelMutex
    4. 调用socket传输Frame的数据
    5. 阻塞等待结果,也就是通过BlockingCell进行交换数据,这里有超时时间
  2. handleCompleteInboundCommand(AMQCommand command)

    • 执行结束之后做后置处理
    • image-20210712203510756
    1. 记录command的命令,一般调试用的
    2. 处理异步操作之后,是否需要继续处理
    3. 是否需要检查rpc响应类型,处理类型是否满足
    4. 唤醒下一次rpc调用,返回本次rpc结果
    5. 将结果写到交互对象,有两种方式一种是Future方式和BlockingCell方式
    6. 标记Rpc完成

3、内部类和接口

3.1、 RpcContinuation接口

3.1.1、方法

方法名描述
void handleCommand处理命令
boolean canHandleReply返回true表示可以处理该请求
void handleShutdownSignal处理关闭信号异常

3.2、BlockingRpcContinuation implements RpcContinuation

3.2.1、成员变量

类型和名称默认值描述
BlockingValueOrException _blockernew BlockingValueOrException要么是值要么是异常
Method request请求方法

3.2.2、方法和构造方法

方法名描述
BlockingRpcContinuation无参和有参构造函数
void handleCommand处理命令
void handleShutdownSignal设置异常
T getReply获取返回值
boolean canHandleReply可以处理请求(请求类型去获取可以处理的响应类型,默认方法后缀加上Ok)
abstract T transformReply获取转换AMQCommand结果

3.3、SimpleBlockingRpcContinuation extends BlockingRpcContinuation

  • 直接复用父类的方法,且transforReply直接返回传入command的值。
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:31:50  更:2021-07-13 17:31:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 19:10:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码