上一级分析一下rabbitmqAMQP接口的源码,AMQP接口源码中还有一个BasicProperties内部类没有仔细分析,这节做这件事情,让我们开始
文章目录
1、Cloneable (克隆)
- 复制,它是一个形容词,具备某种能力,这个接口没有具体的方法,代表它具有克隆对象功能
2、ContentHeader 接口
- 内容头部接口
2.1、方法
方法名 | 描述 | |
---|---|---|
int getClassId | 获取类id | |
String getClassName | 获取类名称 | |
void appendPropertyDebugStringTo(StringBuilder buffer) | debug使用 |
3、AMQContentHeader (抽象类)
- 它实现了ContentHeader接口
3.1、成员变量
变量名 | 默认值 | 描述 |
---|---|---|
long bodySize | 0 | frame的内容大小 |
方法名 | 描述 | 图示 |
---|---|---|
AMQContentHeader() | 无参构造方法 | |
AMQContentHeader(DataInputStream in) | 有一个参数构造方法 in.readShort 权重 in.readLong 内容大小 | |
long getBodySize | 返回bodySize | |
abstract void writePropertiesTo (ContentHeaderPropertyWriter writer) | 抽象方法,写头部内容信息 | |
void appendPropertyDebugStringTo(StringBuilder buffer) | debug使用 | 实现了 |
Frame toFrame(int chanelNumber, long bodySize) | 变成toFrame | 1 |
Object clone() | 实现父类clone方法 | |
3.2、图示
4、BasicProperties 接口
- 基本接口方法 (都是属性的GET方法接口)
4.1、方法
方法名 | 描述 | |
---|---|---|
String getContentType() | 取出contentType字段 | |
String getContentEncoding() | 取出contentEncoding字段 | |
Map<String, Object> getHeaders() | 取出请求头的参数以map形式返回 | |
Integer getDeliveryMode() | 取出deliveryMode字段 | |
Integer getPriority() | 取出priority字段 | |
String getCorrelationId() | 取出correlationId字段 | |
String getReplyTo() | 取出replyTo字段 | |
String getExpiration() | 取出expiration字段 | |
String getMessageId() | 获取messageId字 | |
Date getTimestamp() | 获取timestamp字段 | |
String getType() | 获取type字段 | |
String getUserId() | 获取userId字段 | |
String getAppId() | 获取appId字段 |
5、AMQBasicProperties 抽象类
- 提供两个构造方法,一个是无参和一个带DataInputStream 入参
- 重写clone()方法,取出也是super.clone
6、BasicProperties
6.1、成员变量
-
字段名 默认值 描述 String contentType 内容类型 String contentEncoding 内容编码 Map<String, Object> headers 请求头信息 Integer deliveryMode 传输模式 Integer priority 优先级 String correlationId 关联id String replyTo 回应 String expiration 失效 String messageId 消息id Date timestamp 时间戳 String type 类型 String userId 用户id String appId 应用id String clusterId 集群id
6.2、方法
方法名 | 描述 | 图示 |
---|---|---|
BasicProperties(全部成员) | 全部成员变量的构造方法,对应不变集合一般会用Collection.unmodifiableXXX包一下 | |
BasicProperties(DataInputStream in ) | DataInputStream入参的构造方法, 先预读一波判断是否有存在该字段,然后才正式读取内容 | |
BasicProperties() | 无参构造方法 | |
int getClassId() | 类id 返回60 | |
String getClassName | 类名称为 “basic” | |
boolean equals(Object o) | 所有成员字段都必须相等 | |
int hashCode() | 所有字段hash | |
Builder builder() | 创建一个构建器 | |
对于BasicProperties get方法 | 就是返回对于成员变量 | |
void writeProperites(ContentHeaderPropertyWriter writer) | 写属性,先写present boolean值(这个字段是否存在) | |
void appendPropertyDebugStringTo(StringBuilder acc) | 调试使用 |
6.3、内部类
- Builder 构建器类
- 主要是构建这些属性
7、总结
- 值得学习还是建造者的设计模式
- 有点疑惑的是为啥get方法需要先定义一个接口
- 现在有大致印象了,但是问题写这些字段写到DataInputStream 是否规则ContentHeaderPropertyWriter 和ContentHeaderPropertyReader,以及ValueReader和ValueWriter, 看怎么对DataOutputStream进行封装