[七]RabbitMQ-客户端源码之AMQPImpl+Method
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-client-source-code-of-amqpimpl/
AMQPImpl类包括AMQP接口(public class AMQImpl implements AMQP)主要囊括了AMQP协议中的通信帧的类别。
这里以Connection.Start帧做一个例子。
public static class Connection {public static final int INDEX = 10;public static class Startextends Methodimplements com.rabbitmq.client.AMQP.Connection.Start{public static final int INDEX = 10;private final int versionMajor;private final int versionMinor;private final Map<String,Object> serverProperties;private final LongString mechanisms;private final LongString locales;
....//下面省略很多代码。。。
可以看到Start类是Connection类的内部静态子类,表示此Start类为Connection.Start,而且Start类是继承Method方法的,包括接下来所有的AMQP协议帧都是继承这个Method方法,Method可以看成用来区分AMQP协议帧的类型。
Method类是一个抽象类(Base class for AMQP method objects, specialized by autogenerated code in AMQP.java),我们来看下Method类的代码:
public abstract class Method implements com.rabbitmq.client.Method {/** {@inheritDoc} */public abstract int protocolClassId(); /* properly an unsigned short *//** {@inheritDoc} */public abstract int protocolMethodId(); /* properly an unsigned short *//** {@inheritDoc} */public abstract String protocolMethodName();/*** Tell if content is present.* @return true if the wire-protocol for this method should involve a content header and body,* or false if it should just involve a single method frame.*/public abstract boolean hasContent();/*** Visitor support (double-dispatch mechanism).* @param visitor the visitor object* @return the result of the "visit" operation* @throws IOException if an error is encountered*/public abstract Object visit(MethodVisitor visitor) throws IOException;/*** Private API - Autogenerated writer for this method.* @param writer interface to an object to write the method arguments* @throws IOException if an error is encountered*/public abstract void writeArgumentsTo(MethodArgumentWriter writer) throws IOException;/*** Public API - debugging utility* @param buffer the buffer to append debug data to*/public void appendArgumentDebugStringTo(StringBuilder buffer) {buffer.append("(?)");}@Override public String toString() {StringBuilder sb = new StringBuilder();sb.append("#method<").append(protocolMethodName()).append(">");this.appendArgumentDebugStringTo(sb);return sb.toString();}public Frame toFrame(int channelNumber) throws IOException {Frame frame = new Frame(AMQP.FRAME_METHOD, channelNumber);DataOutputStream bodyOut = frame.getOutputStream();bodyOut.writeShort(protocolClassId());bodyOut.writeShort(protocolMethodId());MethodArgumentWriter argWriter = new MethodArgumentWriter(new ValueWriter(bodyOut));writeArgumentsTo(argWriter);argWriter.flush();return frame;}
}
代码不长。挑几个解释下。
protocolClassId()和protocolMethodId():每一个Method(Connection.Start/.StartOk, Connection.Tune/.TuneOk等等)都包含classId和methodId,可以参考下图:
protocolMethodName()返回本Method的名称,比如Connection.Start的就是:
public String protocolMethodName() { return "connection.start";}
boolean hasContent()用来区分这个Method之后是否有Content-Body,比如Connection.Start的为:
public boolean hasContent() { return false; }
又比如Basic.Publish的为:
public boolean hasContent() { return true; }
好了,这里可以回来接着讲AMQPImpl了。
下面是一张表,用来涵盖AQMP协议各个种类的Method以及其一些属性,看完这张表就看完了AMQPImpl的全部。
Method-Name | classId | methodId | hasContent |
---|---|---|---|
Connection.Start | 10 | 10 | false |
Connection.StartOk | 10 | 11 | false |
Connection.Secure | 10 | 20 | false |
Connection.SecureOk | 10 | 21 | false |
Connection.Tune | 10 | 30 | false |
Connection.TuneOk | 10 | 31 | false |
Connection.Open | 10 | 40 | false |
Connection.OpenOk | 10 | 41 | false |
Connection.Close | 10 | 50 | false |
Connection.CloseOk | 10 | 51 | false |
Connection.Blocked | 10 | 60 | false |
Connection.Unblocked | 10 | 61 | false |
Channel.Open | 20 | 10 | false |
Channel.OpenOk | 20 | 11 | false |
Channel.Flow | 20 | 20 | false |
Channel.FlowOk | 20 | 21 | false |
Channel.Close | 20 | 40 | false |
Channel.CloseOk | 20 | 41 | false |
Access.Request | 30 | 10 | false |
Access.RequestOk | 30 | 11 | false |
Exchange.Declare | 40 | 10 | false |
Exchange.DeclareOk | 40 | 11 | false |
Exchange.Delete | 40 | 20 | false |
Exchange.DeleteOk | 40 | 21 | false |
Exchange.Bind | 40 | 30 | false |
Exchange.BindOk | 40 | 31 | false |
Exchange.Unbind | 40 | 40 | false |
Exchange.UnbindOk | 40 | 51 | false |
Queue.Declare | 50 | 10 | false |
Queue.DeclareOk | 50 | 11 | false |
Queue.Bind | 50 | 20 | false |
Queue.BindOk | 50 | 21 | false |
Queue.Purge | 50 | 30 | false |
Queue.PurgeOk | 50 | 31 | false |
Queue.Delete | 50 | 40 | false |
Queue.DeleteOk | 50 | 41 | false |
Queue.Unbind | 50 | 50 | false |
Queue.UnbindOk | 50 | 51 | false |
Basic.Qos | 60 | 10 | false |
Basic.QosOk | 60 | 11 | false |
Basic.Consume | 60 | 20 | false |
Basic.ConsumeOk | 60 | 21 | false |
Basic.Cancel | 60 | 30 | false |
Basic.CancelOk | 60 | 31 | false |
Basic.Publish | 60 | 40 | true |
Basic.Return | 60 | 50 | true |
Basic.Deliver | 60 | 60 | true |
Basic.Get | 60 | 70 | false |
Basic.GetOk | 60 | 71 | true |
Basic.GetEmpty | 60 | 72 | false |
Basic.Ack | 60 | 80 | false |
Basic.Reject | 60 | 90 | false |
Basic.RecoverAsync | 60 | 100 | false |
Basic.Recover | 60 | 110 | false |
Basic.RecoverOk | 60 | 111 | false |
Basic.Nack | 60 | 120 | false |
Tx.Select | 90 | 10 | false |
Tx.SelectOk | 90 | 11 | false |
Tx.Commit | 90 | 20 | false |
Tx.CommitOk | 90 | 21 | false |
Tx.Rollback | 90 | 30 | false |
Tx.RollbackOk | 90 | 31 | false |
Confirm.Select | 85 | 10 | false |
Confirm.SelectOk | 85 | 11 | false |
附:本系列全集
- [Conclusion]RabbitMQ-客户端源码之总结
- [一]RabbitMQ-客户端源码之ConnectionFactory
- [二]RabbitMQ-客户端源码之AMQConnection
- [三]RabbitMQ-客户端源码之ChannelManager
- [四]RabbitMQ-客户端源码之Frame
- [五]RabbitMQ-客户端源码之AMQChannel
- [六]RabbitMQ-客户端源码之AMQCommand
- [七]RabbitMQ-客户端源码之AMQPImpl+Method
- [八]RabbitMQ-客户端源码之ChannelN
- [九]RabbitMQ-客户端源码之Consumer
欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-client-source-code-of-amqpimpl/
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
[七]RabbitMQ-客户端源码之AMQPImpl+Method相关推荐
- RabbitMQ 客户端源码系列 - Channel
前言 续上次分享 RabbitMQ 客户端源码系列 - Connection ,继续分享Channel相关的源码分析 (com.rabbitmq:amqp-client:4.8.3) 友情提醒:本次分 ...
- RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码
目录 第十章-RabbitMQ之Spring客户端源码 1. 前言 2. 客户端消费代码 2.1 消费的实现方式 2.2 消费中注解解释 2.3 推测Spring实现过程 3.MQ消费源码分析 3.1 ...
- TeamTalk客户端源码分析七
TeamTalk客户端源码分析七 一,CBaseSocket类 二,select模型 三,样例分析:登录功能 上篇文章我们分析了network模块中的引用计数,智能锁,异步回调机制以及数据的序列化和反 ...
- Spring源码深度解析(郝佳)-学习-Spring消息-整合RabbitMQ及源码解析
我们经常在Spring项目中或者Spring Boot项目中使用RabbitMQ,一般使用的时候,己经由前人将配置配置好了,我们只需要写一个注解或者调用一个消息发送或者接收消息的监听器即可,但是底 ...
- zookeeper 客户端_zookeeper进阶-客户端源码详解
流程图 先看一下客户端源码的流程图 总体流程 总体流程 开启SendThread线程 开启EventThread 总结 下面根据源码讲解,大家整合源码和流程图一起看最好,本篇内容比较多建议收藏起来看. ...
- grpc-go客户端源码分析
grpc-go客户端源码分析 代码讲解基于v1.37.0版本. 和grpc-go服务端源码分析一样,我们先看一段示例代码, const (address = "localhost:50051 ...
- WordPress Blog Android客户端源码分析(一)
一直想找一个大型的Android开源项目进行分析,由于自身和导师课程需要选择了wordpress的Android客户端源码进行学习和解读.源码github官方下载地址:开源项目地址.分析源码的最佳手段 ...
- ZooKeeper客户端源码(零)——客户端API使用
首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 本篇源码基于ZooKeeper3.7.0版本. 一.建立连接和会话 客户端可以通过创建一个 Zo ...
- Libcurl的编译_HTTP/HTTPS客户端源码示例
HTTP/HTTPS客户端源码示例 环境: zlib-1.2.8 openssl-1.0.1g curl-7.36 Author: Kagula LastUpdateDate: 2016-05 ...
最新文章
- iOS 导航栏遮挡问题 --- iOS开发系列 ---项目中成长的知识七
- 任意用户密码重置(四):重置凭证未校验
- JVM 核心技术 调优分析与面试经验
- java在文件的后面添加_java 在file的尾部添加数据的两种方法总结
- evt参数是干啥用的_塑料凳子上的洞,是干啥用的?
- 用c语言编程求分数和,用C语言编程平均分数
- shell 12 21 filename重定向的含义和区别
- Hadoop基础知识
- 异步调用结果的获取(转)
- linux桌面版如何添加新网络,ubuntu网络配置(桌面版和服务器版)
- Shoulda, Woulda, Coulda
- Ubuntu下Tinyos安装步骤
- IE8-阿里icon字体引用不显示的问题
- 论文中 一级标题、二级标题等 对应格式的统一修改
- linux编写路由器固件,在Linux下用tftp刷写路由器固件
- 伊利诺伊大学厄本那 香槟分校计算机科学,美国伊利诺伊大学厄本那香槟分校专业设置...
- CTA 认证android平台 彩信/ MMS 受控原理
- 如果有一天我老无所依,请把我埋在,新疆的田野上
- UPC-5572 - Lifeguards - 动态规划
- 安卓动画的简单实现方法(Animation和AnimationDrawable)