第23篇我们介绍AMQPMethod基础指令的实现,也熟悉contentHeader,请求头属性信息,现在有疑问它是怎么将Method指令和header属性,以及body组合成一个整体的?这个时候我们需要介绍今天CommandAssembler, 翻译一下就是命令组装
- 它的工作是把多个Frame的拼在一起。
- 它是一个线程安全的。
1、成员变量和常量
名称 | 默认值 | 描述 |
---|---|---|
final byte[] EMPTY_BYTE_ARRAY | new 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、图示
-
CommandAssembler(method,contentHeader,body)
-
数据可能需要多次传过来,那么怎么算一个完成命令呢,此时需要将body进行缓存起来,也就bodyN集合,同时通过状态控制,表示当前达到什么步骤呢
-
-
总结
-
简单赋值
-
将传body的数组进行计数
-
method是必须要有的,否则需要寻求
-
contentHeader 表示请求头属性是否需要
-
判断内容是否完整了,利用remaingBodyBytes表示还剩余多少才是完成的主体内容。
-
-
-
handleFrame(Frame f)
- 总结
- 处理Method类型的Frame数据 (必填)
- 处理ContentHeader的Frame数据 (可有可无),但是主体数据长度是在ContentHeader上
- 处理ContentBody,处理主体数据,可能数据很大,会分很多帧过来
- 判断当前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、总结
- CommandAssembler主要目的是缓存主体内容,等待组装一个完整的命令