做了这么多准备工作,终于可以看一下AMQConnection源码了,可以看到整个指令运行和整体准备工作,在通道中真正干活的。没错开干
![image-20210623150117568](https://i-blog.csdnimg.cn/blog_migrate/a7e661d1dd73d166d7f912aff6eae991.png)
1、NetworkConnection
方法名 | 描述 | |
---|
InetAddress getLocalAddress() | 获取客户端地址 | |
int getLocalPort(); | 获取客户端端口 | |
InetAddress getAddress() | 获取对等地址 | |
int getPort() | 获取对等端口 | |
2、ShutdownNotifierComponent 类
- 这个类是ShutdownListener监听器管理类,且会记录关闭的原因,这个是Channel和Connection都有关闭监听器。
2.1、成员变量或常量
类型和名称 | 默认值 | 含义 |
---|
Object monitor | new Object() | 同步锁 |
List shutdownListeners | new ArrayList() | 所有关闭监听器 |
volatile ShutdownSignalException shutdownCause | null | 关闭信号异常 |
2.2、方法
方法名 | 描述 | |
---|
void addShutdownListener | 添加关闭监听器,如果有异常,直接执行关闭异常 | |
ShutdownSingalException get CloseReason | 获取关闭异常 | |
void notifyListeners | 通知关闭的消息 | |
void removeShutdownListener | 移除关闭监听器 | |
boolean isOpen | 判断是否打开, true表打开,false表示关闭 | |
boolean setShutdownCauseIfOpen | 如果关闭设置异常的值(shutdownCause) | |
| | |
3、AMQConnection类
- 代表和管理到broker的AMQP连接的具体类, 使用ConnectionFactory创建一个连接对象
3.1、成员变量和常量
名称 | 默认值 | 描述 |
---|
double CHANNEL_SHUTDOWN_TIMEOUT_MULTIPLIER | 1.05 | 我们希望socket写入和通道关闭超时在心跳后启动,因此我们使用有效心跳超时的105%的值 |
ExecutorService consumerWorkServiceExecutor | | 消费者服务执行器 |
ScheduledExecutorService heartbeatExecutor | | 心跳服务执行器 |
ExecutorService shutdownExecutor | | 关闭服务执行器 |
Thread mainLoopThread | | 主线程监听frame任务 |
ThreadFactory threadFactory | Executors.defaultThreadFactory | 线程创建的工厂类 |
String id | | |
final List recoveryCanBeginListeners | Collections.synchronizedList(new ArrayList()) | 恢复之后增加监听,同步 |
ErrorOnWriteListener errorOnWriteListener | | IO异常监听器 |
int workPoolTimeout | | 工作池超时时间 |
AtomicBoolean finalShutdownStarted | new AtomicBoolean(false) | 关闭原子状态 |
Version clientVersion | new Version(0,9) | 版本信息 |
AMQChannel _channel0 | | 为0通道 |
ConsumerWorkService _workService | null | 工作服务 |
FrameHandler _frameHandler | | Frame处理器 |
volatile boolean _running | false | 标记是否运行 |
ExceptionHandler _execeptionHandler | | 未捕获异常处理 |
BlockingCell _appContinution | new Blocking() | 阻塞元件 |
volatile boolean _brokerInitiatedShutdown | | 客户端接收到Broker的Connection.Close消息 |
volatile boolean _inConnectionNegotiation | | 启动时候协商连接对象 |
HeartbeatSender _heartbeatSender | | 心跳 |
final String _virtualHost | | 虚拟主机 |
final Map<String, Object> _clientProperties | | 客户端属性 |
final SaslConfig saslConfig | | 登录验证配置机制 |
final int requestedHeartbeat | | 请求的心跳 |
final int requestedChannelMax | | 请求通道最大数 |
final int requestedFrameMax | | 请求Frame最大数 |
final int handshakeTimeout | | 握手超时时间 |
final int shutdownTimeout | | 关闭超时 |
final CredentialsProvider credentialsProvider | | 用户名和密码 |
final Collection blockedListeners | | 阻塞监听器 |
final MetricsCollector metricsCollector | | 指标收集 |
final int channelRpcTimeout | | 通道rpc超时 |
final boolean channelShouldCheckRpcResponseType | | 通道应该检查rpc响应类型 |
TrafficListener trafficListener | | 打印指令(调试用的) |
volatile int _frameMax | 0 | 0表示没有限制,frame的长度 |
volatile int _missedHeartbeats | 0 | 心跳超时计数 |
volatile in _heartbeat | 0 | 0,表示没有心跳,心跳时间间隔 |
volatile ChannelManager _channelManager | | 通道管理 |
volatile Map<String, Object> _serverProperties | | 保存服务器端属性(来自于connection.start指令) |
3.2、方法
方法名 | 描述 | 图示 |
---|
final void disconnectChannel(ChannelN channel) | 断开链接 | |
Map<String, Object> getServerProperties() | 获取服务端属性 | |
AMQConnection(param) | 构造方法 | 1 |
void start() | 启动方法,做一些初始化操作 | 2 |
Channel createChannel(int channelNumber) | 创建通道对象 | |
void writeFrame(Frame f) | 写入数据帧 | |
boolean handleReadFrame(frame) | 读取数据帧 | |
void handleHeartbeatFailure() | 处理心跳异常 | |
void handleIoError(Throwable ex) | 处理io异常 | |
void doFinalShutdown() | 做最终的关闭操作 | |
void addRecoveryCanBeginListener() | 添加恢复监听器 | |
boolean processControlCommand(Command c) | 处理通道0的command | |
void handleConnectionClose | 处理连接关闭 | |
void close() | 关闭对象 | |
addBlockedListener() | 添加Blocked监听器 | |
boolean removeBlockedListener | 移除监听 | |
3.3、图示
1、AMQConnection(param) 构造方法
- 预先判断Frame是否正确,测试使用的,应该删掉
- 创建_channel0 编号为0通道,也就默认有通道为0
2、start() 方法
![image-20210709185854449](https://i-blog.csdnimg.cn/blog_migrate/2fefa7ab0424276674b531a3f36fb669.png)
1. 创建消费工作服务对象
2. 创建心跳发送对象
3. 发送请求头信息
4. 初始化主线程(死循环,接收服务的响应)
5. 刚开始获取到服务器端Start指令
6. 获取Start中版本和客户版本是否兼容
7. 跟服务器端sasl机制去包装用户名和密码
8. 发送微调请求指令
9. 协商通道最大连接数,最大数据帧大小,心跳间隔
10. 向服务器端发送最终协商的结果
11. 打开连接对象,可以正常提供服务了。