第24篇 rabbitmq CommandAssembler源码分析

第23篇我们介绍AMQPMethod基础指令的实现,也熟悉contentHeader,请求头属性信息,现在有疑问它是怎么将Method指令和header属性,以及body组合成一个整体的?这个时候我们需要介绍今天CommandAssembler, 翻译一下就是命令组装

  • 它的工作是把多个Frame的拼在一起。
  • 它是一个线程安全的。

1、成员变量和常量

名称默认值描述
final byte[] EMPTY_BYTE_ARRAYnew byte[0]空数组
CAState state当面命名状态,还缺啥不
Method method就是签名学习Method指令
AMQContentHeader contentHeader请求头属性
List<byte[]> bodyN请求内容碎片
int bodyLength内容累计长度
long remaingBodyBytes剩余内容字节数组长度

2、方法

方法名描述图示
CommandAssembler(method,contentHeader,body)构造函数1
synchronized Method getMethod()返回method对象
synchronized AMQContentHeader getContentHeader请求头对象
synchronized boolean isComplete()当前命令是否为一个完整命令
synchronized byte[] getContentBody()合并内容主体(将多个byte[]成一个byte[]
synchronized boolean handleFrame(Frame f)处理具体Frame数据2

2.1、图示

  1. CommandAssembler(method,contentHeader,body)

    • 数据可能需要多次传过来,那么怎么算一个完成命令呢,此时需要将body进行缓存起来,也就bodyN集合,同时通过状态控制,表示当前达到什么步骤呢

    • 总结

      1. 简单赋值

      2. 将传body的数组进行计数

      3. method是必须要有的,否则需要寻求

      4. contentHeader 表示请求头属性是否需要

      5. 判断内容是否完整了,利用remaingBodyBytes表示还剩余多少才是完成的主体内容。

  2. handleFrame(Frame f)

    • image-20210621212238281
    • 总结
      1. 处理Method类型的Frame数据 (必填)
      2. 处理ContentHeader的Frame数据 (可有可无),但是主体数据长度是在ContentHeader上
      3. 处理ContentBody,处理主体数据,可能数据很大,会分很多帧过来
      4. 判断当前command是否是完整了

3、内部枚举类CAState

  •  private enum CAState {
            EXPECTING_METHOD, EXPECTING_CONTENT_HEADER, EXPECTING_CONTENT_BODY, COMPLETE
        }
    
  • EXPECTING_METHOD : 期望下一次请求是Method的Frame

  • EXPECTING_CONTENT_HEADER : 期待下一次请求是Content_header的Frame

  • EXPECTING_CONTENT_BODY : 期待下一次请求是Content_body

  • COMPLETE: 当前这条数据已经完整了

4、总结

  1. CommandAssembler主要目的是缓存主体内容,等待组装一个完整的命令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值