[四]RabbitMQ-客户端源码之Frame


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-client-source-code-of-frame/


Frame是指AMQP协议层面的通信帧(一个正式定义的连接数据包)。
我们来看下Frame类中的成员变量有哪些:

/** Frame type code */
public final int type;

/** Frame channel number, 0-65535 */
public final int channel;

/** Frame payload bytes (for inbound frames) */
private final byte[] payload;

/** Frame payload (for outbound frames) */
private final ByteArrayOutputStream accumulator;

Frame里的三个成员变量:type, channel, payload是真正和报文有关的。accumulator是为了方便内部编程的一个变量。Frame类就是对这个玩意儿捯饬捯饬,没有什么难度,好奇的同学可以自己翻看下,本文主要来阐述下AMQP中的Frame的一些信息。

一个通信帧的协议层面的结构如下:

序号名称占用字节
1frame type1B
2channel number2B
3payload length4B
4payload[0-N]B
5FRAME_END(结束帧)1B(0xCE)

这样可以知道:一个通信帧的最小大小为:1B+2B+4B+0B+1B=8B.

AMQP 定义了如下的帧类型:

  1. Type = 1, “METHOD”: 方法帧
  2. Type = 2, “HEADER”: 内容头帧
  3. Type = 3, “BODY”: 内容体帧.
  4. Type = 8, “HEARTBEAT”: 心跳帧.

通道编号为0的代表全局连接中的所有帧,1-65535代表特定通道的帧.

方法帧
type=1, payload包含以下内容:
classId:2B
methodId:2B
argument:NB

内容头帧
type=2,payload包含以下内容
classId:2B
weight:2B
BodySize:8B
property flags:2B
properties: NB

内容帧
type=3, payload不进行具体解析,

心跳帧
tpye=8,没有payload。心跳帧的channel number必须为0。


附:本系列全集

  1. [Conclusion]RabbitMQ-客户端源码之总结
  2. [一]RabbitMQ-客户端源码之ConnectionFactory
  3. [二]RabbitMQ-客户端源码之AMQConnection
  4. [三]RabbitMQ-客户端源码之ChannelManager
  5. [四]RabbitMQ-客户端源码之Frame
  6. [五]RabbitMQ-客户端源码之AMQChannel
  7. [六]RabbitMQ-客户端源码之AMQCommand
  8. [七]RabbitMQ-客户端源码之AMQPImpl+Method
  9. [八]RabbitMQ-客户端源码之ChannelN
  10. [九]RabbitMQ-客户端源码之Consumer

欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-client-source-code-of-frame/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值