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

- 这个类是AMQ通道基础类, 它继承了ShutdownNotifierComponent类
1、ShutdownNotifierComponent 类
- 这个类是ShutdownListener监听器管理类,且会记录关闭的原因,这个是Channel和Connection都有关闭监听器。
1.1、成员变量或常量
类型和名称 | 默认值 | 含义 |
---|
Object monitor | new Object() | 同步锁 | List shutdownListeners | new ArrayList() | 所有关闭监听器 | volatile ShutdownSignalException shutdownCause | null | 关闭信号异常 |
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_TIMEOUT | 0 | rpc调用无超时时间 | Object _channelMutex | new Object() | | AMQConnection _connection | | 这个通道关联连接对象 | int _channelNumber | | 通道数字编号 | RpcWrapper _activeRpc | null | 当前未完成rpc请求,将来可能是队列 | volatile boolean _blockContent | false | 是否阻止内容传输 | int _rpcTimeout | | rpc超时时间 | _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) | 处理没有经过异步处理command | 2 | void processShutdownSignal | 处理关闭信号 | | | | |
2.3、图示
-
AMQCommand exnWrappingRpc(Method m)
- 方法就是发送请求,然后将异常包装成IO异常,上传图片,且是同步

- 调用rpc方法
- 先判断是否关闭,也就是shutdownException是否有值
- 入队,其实抢通道的独占锁,_channelMutex
- 调用socket传输Frame的数据
- 阻塞等待结果,也就是通过BlockingCell进行交换数据,这里有超时时间
-
handleCompleteInboundCommand(AMQCommand command)
- 执行结束之后做后置处理

- 记录command的命令,一般调试用的
- 处理异步操作之后,是否需要继续处理
- 是否需要检查rpc响应类型,处理类型是否满足
- 唤醒下一次rpc调用,返回本次rpc结果
- 将结果写到交互对象,有两种方式一种是Future方式和BlockingCell方式
- 标记Rpc完成
3、内部类和接口
3.1、 RpcContinuation接口
3.1.1、方法
方法名 | 描述 | |
---|
void handleCommand | 处理命令 | | boolean canHandleReply | 返回true表示可以处理该请求 | | void handleShutdownSignal | 处理关闭信号异常 | |
3.2、BlockingRpcContinuation implements RpcContinuation
3.2.1、成员变量
类型和名称 | 默认值 | 描述 |
---|
BlockingValueOrException _blocker | new 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的值。
|