第20篇 rabbitmq ContentHeaderPropertyReader源码分析

第18篇和第19篇了解最基础的ValueWriter 和 ValueReader对不同类型的数据编码的字节数组中有一定了解,我们现在往上看一下使用ValueWriter和ValueReader的类,我先看一下ContentHeaderPropertyReader和ContenHeaderPropertyWriter

1、ContentHeaderPropertyReader

  • 其实对ValueReader封装

1.1、成员变量

变量名默认值描述
final ValueReader in值读取类
int flagWord1当前字段标志位
int bitCount15当前flag位置计算

1.2、方法

方法名描述图示
ContentHeaderPropertyReader(DataInputStream in)构造方法
boolean readPresence()读取当前二进制位的属性,有点类型布隆过滤器1
void finishPresence()表示flagWord第0位不会是1,1只有在初始化才有
String readShortstr读取short字符串
LongString readLongstr()读取字符串转换成LongString
Integer readShort()直接读取short值
Integer readLong()实际读取的int值
Long readLonglong()读取long值
Map<String, Object> readTable()读取map值
int readOctet()读取byte值(无符号)
Date readTimestamp()读取时间戳

1.3、flagWord描述

  • image-20210618165737456

  • 总结

    1. flagWord其实就是利用一个int类型二进制位 ,0 表示该值不存在,1表示该值存在
    2. 由于目前是14个字段所以利用是, 2-15位二进制表示。
    3. 具体某一位表示什么字段值是否存在,参看字段编号

1.4、图示

  1. boolean readPresence
    • image-20210618171234075
    • 总结
      1. 首先读取flagWord 这个是判断这属性是否存在,0表示不存在,1表示存在,利用二进制的特性
      2. 位数移动首先从移动15位开始一直到移动2位结束,bitCount进行计数
      3. 移动对应位置进行&运算即可

2、ContentHeaderPropertyWriter 类

  • 其实仔细看一下就会发现,类似ValueWriter和ValueReader关系,我们想办法把属性写到字节数组中
  • 由ContentHeaderPropertyWriter可以知道其实它属性是14个,写属性过程如下
    • 先定义一个flagWord,遍历14个属性,如果属性存在,就在flagWord位置上填1否则就填0
    • 属性全部遍历完之后,将flagWord写到流中(字节数组中)
    • 然后在按顺序依次写入对应属性值即可

2.1、成员变量

变量值默认值描述
final ValueWriter out值写出
int flagWord0表示header相关属性是否存在
int bitCount0计数属性个数,跟移位有关

2.2、方法

方法名描述图示
ContentHeaderPropertyWriter(DataOutputStream out)构造方法
void writePresence(boolean present)写属性标志位是否存在,形成flagWord1
void finishPresence()将flagWord写到流中
void writeShortstr写short字符串
void writeLongstr写比较长的字符串
void writeShort(Integer s)写short值
void writeLong(Integer l)写int值
void writeLonglong(Long ll)写long值
void writeTable(Map<String, Object> table)写table值
void writeOctet(Integer octet)写类型简写(无符号byte)
void writeOctet(int octet)写类型简写(无符号byte)
void writeTimestamp(Date timestamp)写时间戳

2.3、图示

  1. writePresence(boolean present)
  • image-20210618175516440
  • 总结
    1. 这情况分支应该不会走,目前来说只有14属性,不可能到等于15
    2. 如果属性存在进行移位,使用二进制或运算,对位置填上1
    3. 该方法执行完之后,执行finishPresence写入flagWord的值

3、总结

  • 主要了解一下ContentHeader如何写属性,最关键就是flagWord字段,来判断某个属性是否存在
  • 关键方法也就是writePresence() 和finishPresence()方法设置flagWord和写flagWord字段
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值