欢迎支持笔者新作:《深入理解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

附:本系列全集

  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-amqpimpl/


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


[七]RabbitMQ-客户端源码之AMQPImpl+Method相关推荐

  1. RabbitMQ 客户端源码系列 - Channel

    前言 续上次分享 RabbitMQ 客户端源码系列 - Connection ,继续分享Channel相关的源码分析 (com.rabbitmq:amqp-client:4.8.3) 友情提醒:本次分 ...

  2. RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码

    目录 第十章-RabbitMQ之Spring客户端源码 1. 前言 2. 客户端消费代码 2.1 消费的实现方式 2.2 消费中注解解释 2.3 推测Spring实现过程 3.MQ消费源码分析 3.1 ...

  3. TeamTalk客户端源码分析七

    TeamTalk客户端源码分析七 一,CBaseSocket类 二,select模型 三,样例分析:登录功能 上篇文章我们分析了network模块中的引用计数,智能锁,异步回调机制以及数据的序列化和反 ...

  4. Spring源码深度解析(郝佳)-学习-Spring消息-整合RabbitMQ及源码解析

      我们经常在Spring项目中或者Spring Boot项目中使用RabbitMQ,一般使用的时候,己经由前人将配置配置好了,我们只需要写一个注解或者调用一个消息发送或者接收消息的监听器即可,但是底 ...

  5. zookeeper 客户端_zookeeper进阶-客户端源码详解

    流程图 先看一下客户端源码的流程图 总体流程 总体流程 开启SendThread线程 开启EventThread 总结 下面根据源码讲解,大家整合源码和流程图一起看最好,本篇内容比较多建议收藏起来看. ...

  6. grpc-go客户端源码分析

    grpc-go客户端源码分析 代码讲解基于v1.37.0版本. 和grpc-go服务端源码分析一样,我们先看一段示例代码, const (address = "localhost:50051 ...

  7. WordPress Blog Android客户端源码分析(一)

    一直想找一个大型的Android开源项目进行分析,由于自身和导师课程需要选择了wordpress的Android客户端源码进行学习和解读.源码github官方下载地址:开源项目地址.分析源码的最佳手段 ...

  8. ZooKeeper客户端源码(零)——客户端API使用

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 本篇源码基于ZooKeeper3.7.0版本. 一.建立连接和会话 客户端可以通过创建一个 Zo ...

  9. Libcurl的编译_HTTP/HTTPS客户端源码示例

    HTTP/HTTPS客户端源码示例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2016-05 ...

最新文章

  1. iOS 导航栏遮挡问题 --- iOS开发系列 ---项目中成长的知识七
  2. 任意用户密码重置(四):重置凭证未校验
  3. JVM 核心技术 调优分析与面试经验
  4. java在文件的后面添加_java 在file的尾部添加数据的两种方法总结
  5. evt参数是干啥用的_塑料凳子上的洞,是干啥用的?
  6. 用c语言编程求分数和,用C语言编程平均分数
  7. shell 12 21 filename重定向的含义和区别
  8. Hadoop基础知识
  9. 异步调用结果的获取(转)
  10. linux桌面版如何添加新网络,ubuntu网络配置(桌面版和服务器版)
  11. Shoulda, Woulda, Coulda
  12. Ubuntu下Tinyos安装步骤
  13. IE8-阿里icon字体引用不显示的问题
  14. 论文中 一级标题、二级标题等 对应格式的统一修改
  15. linux编写路由器固件,在Linux下用tftp刷写路由器固件
  16. 伊利诺伊大学厄本那 香槟分校计算机科学,美国伊利诺伊大学厄本那香槟分校专业设置...
  17. CTA 认证android平台 彩信/ MMS 受控原理
  18. 如果有一天我老无所依,请把我埋在,新疆的田野上
  19. UPC-5572 - Lifeguards - 动态规划
  20. 安卓动画的简单实现方法(Animation和AnimationDrawable)

热门文章

  1. 验证视图状态MAC失败的解决办法
  2. 2017年12月英语四级翻译预测
  3. linux常用命令和选项
  4. 如何使用spring配合mybatis配置多个数据源并应用?
  5. 设计模式系列·王小二需求历险记(一)
  6. linux为启动菜单加密码
  7. HADOOP-Checkpoint原理
  8. Linux各个版本配置要求
  9. CodeForces - 813E Army Creation(主席树+思维)
  10. CodeForces - 520C DNA Alignment(思维)