第26篇 rabbitmq HeartbeatSender源码分析

开始看AMQConnection源码,这个也是一个比较大的类,首先我需要扫描相关的类,就是这个类相关成员变量,这篇主要解决HeartbeatSender, 看类名就知道是心跳发送类,具体看一下有什么方法和值得学习的地方

  • 它是为一个AMQConnection管理和发送心跳检测,它线程独立于Connection工作线程,两者互不干扰

  • 它是一个final类

1、 成员变量和常量

变量名和常量名默认值描述
final Object monitornew Object()同步锁对象
final FrameHandler frameHandlerFrame处理器,详情参考源码分析
final ThreadFactory threadFactory线程工作类
ScheduledExecutorService executor周期执行(心跳任务)
final boolean privateExecutor这个该类默认创建关闭时候也自动销毁,外部创建Executor不需要管
ScheduledFuture<?> future周期返回值
boolean shutdownfalse标记是否关闭
volatile long lastActivityTime最后一次活跃时间
  • shutdown 成员变量为啥不加volatile关键字呢? 其实它在monitor锁下运行了,不存在多线程情况,而lastActivityTime是存在的

2、方法

方法名描述图示
HeaderbeatSender(frameHandler,
privateExecutor, executor, threadFactory)
构造方法
void signalActivity()当前活动时间(发送Frame最近一次)
void setHeartbeat(int heartbeatSeconds)设置心跳周期任务1
void shutdown()关闭操作2

2.1、图示

  1. void setHeartbeat(int heartbeatSeconds)
    • image-20210623110317545
    • 总结
      1. 判断当前通道状态是关闭吗?如果关闭没有必要执行心跳任务了
      2. 判断future是否为空,也就说明原来是否有心跳任务在跑,有则需要取消历史任务
      3. 是否需要创建线程执行器,单个线程执行器
      4. 它是设置心跳一半触发发送心跳检测,本来60秒触发一次,现在就30秒触发一次, 防止最近活动时间在心跳后面,也就能够正常传输数据,也就说明心跳正常了,只有最近活动时间和心跳间隔一半 小于当前时间,说明需要发心跳检测了,且心跳检测是在0号通道上
      5. 执行周期任务心跳任务
  2. void shutdown()
    • image-20210623113320897
    • 总结
      • 1.有一个疑问,为啥要做锁外关闭执行器呢,锁内为啥不行,难道执行shutdown可能导致死锁什么的?

3、总结

  1. 了解心跳定时周期任务
  2. 心跳默认通道是0
  3. 有个问题点就是为线程执行器需要到锁外执行关闭操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值