第33篇 rabbitmq AMQConnection源码分析

做了这么多准备工作,终于可以看一下AMQConnection源码了,可以看到整个指令运行和整体准备工作,在通道中真正干活的。没错开干

image-20210623150117568

1、NetworkConnection

  • 网络连接接口
方法名描述
InetAddress getLocalAddress()获取客户端地址
int getLocalPort();获取客户端端口
InetAddress getAddress()获取对等地址
int getPort()获取对等端口

2、ShutdownNotifierComponent 类

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

2.1、成员变量或常量

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

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_MULTIPLIER1.05我们希望socket写入和通道关闭超时在心跳后启动,因此我们使用有效心跳超时的105%的值
ExecutorService consumerWorkServiceExecutor消费者服务执行器
ScheduledExecutorService heartbeatExecutor心跳服务执行器
ExecutorService shutdownExecutor关闭服务执行器
Thread mainLoopThread主线程监听frame任务
ThreadFactory threadFactoryExecutors.defaultThreadFactory线程创建的工厂类
String id
final List recoveryCanBeginListenersCollections.synchronizedList(new ArrayList())恢复之后增加监听,同步
ErrorOnWriteListener errorOnWriteListenerIO异常监听器
int workPoolTimeout工作池超时时间
AtomicBoolean finalShutdownStartednew AtomicBoolean(false)关闭原子状态
Version clientVersionnew Version(0,9)版本信息
AMQChannel _channel0为0通道
ConsumerWorkService _workServicenull工作服务
FrameHandler _frameHandlerFrame处理器
volatile boolean _runningfalse标记是否运行
ExceptionHandler _execeptionHandler未捕获异常处理
BlockingCell _appContinutionnew 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 _frameMax00表示没有限制,frame的长度
volatile int _missedHeartbeats0心跳超时计数
volatile in _heartbeat00,表示没有心跳,心跳时间间隔
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

1. 创建消费工作服务对象
2. 创建心跳发送对象
3. 发送请求头信息
4. 初始化主线程(死循环,接收服务的响应)
5. 刚开始获取到服务器端Start指令
6. 获取Start中版本和客户版本是否兼容
7. 跟服务器端sasl机制去包装用户名和密码
8. 发送微调请求指令
9. 协商通道最大连接数,最大数据帧大小,心跳间隔
10. 向服务器端发送最终协商的结果
11. 打开连接对象,可以正常提供服务了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值