RabbitMQ-客户端源码之AMQPImpl+Method
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 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 |
相关文章:
RabbitMQ-客户端源码之AMQPImpl+Method
AMQPImpl类包括AMQP接口(public class AMQImpl implements AMQP)主要囊括了AMQP协议中的通信帧的类别。 这里以Connection.Start帧做一个例子。 public static class Connection {public static final int INDEX 10;public static class Startextends…...
雅思经验(7)
我发现雅思阅读要命的不是难度,而是时间的把控。考试时间是总共一小时,但是要写三篇文章,之后总共40道题目,也就是说每篇文章平均是13.3道。但是他们很多人说,如果誊写答案需要花掉3、4分钟每篇,也就是说真…...
Ubuntu20.04 用 `hwclock` 或 `timedatectl` 设置RTC硬件时钟为本地时区
Ubuntu20.04用 hwclock 或 timedatectl 设置硬件时区为本地时区 可以用hwclock命令 sudo hwclock --localtime --systohc👆效果等同👇 , --localtime的简写是-l ; --systohc的简写是-w sudo hwclock -l -w也可以用timedatectl命令 👆效果等…...
大学物理·第15章【量子物理】
黑体 斯特藩玻耳兹曼定律 维恩定律 光电效应 在光照射下 ,电子从金属表面逸出的现象,叫光电效应. 逸出的电子,叫光电子 经典理论: 光电流值与入射光强成正比截止频率(红限)v0对某种金属来说,只有…...
2010-2019年290个地级市经济发展与城市绿化数据
2010-2019年290个地级市经济发展与城市绿化数据 1、时间:2010-2019年 2、来源:城市统计NJ,缺失情况与NJ一致 3、范围:290个地级市 4、指标: 综合经济:地区生产总值、人均地区生产总值、地区生产总值增…...
【CSS 布局】-多列布局
一、两列布局 两列布局:一列定宽(也有可能由子元素决定宽度),一列自适应的布局。 创建一个父盒子,和子盒子 <div class"container clearfix"><div class"left ">定宽</div><div class"right…...
从C语言向C++过渡
文章目录前言1.命名空间1.域的概念2.命名空间的使用2.C输入&输出3.缺省参数1.概念2.分类3.注意事项4.函数重载5.引用1.概念2.使用注意事项3.引用使用场景4.指针和引用的区别6.内联函数7.auto关键字8.nullptr前言 C被成为带类的C,本文由C语言向C过度,将会初步介…...
Matter 研讨会回顾(第三期)|乐鑫 Matter 免开发方案与证书服务介绍
1 月 17 日,乐鑫举办了以“乐鑫 Matter 免开发方案与证书服务介绍”为主题的第三期 Matter 线上研讨会,介绍乐鑫开箱即用的 ESP-ZeroCode 模组及其免开发 Matter 方案,以及证书生成和预配置相关服务。欢迎观看研讨会的视频回放了解详情。&…...
函数栈帧的创建和销毁——“C”
各位CSDN的uu们你们好呀,今天小雅兰来为大家介绍一个知识点——函数栈帧的创建和销毁。其实这个知识点,我们很早之前就要讲,但是因为我的一系列原因,才一直拖到了现在,那么,话不多说,让我们一起…...
腾讯云对象存储+企业网盘 打通数据链“最后一公里
对云厂商和企业用户来说,随着数据规模的快速增长,企业除了对存储功能和性能的要求不断增加,也越来越注重数据分发的效率。在传统数据分发的过程中,数据管理员往往需要先在存储桶下载对应的客户方案/交付资料,再使用微信…...
在浏览器输入url到发起http请求,这过程发生了什么
当用户输入url,操作系统会将输入事件传递到浏览器中,在这过程中,浏览器可能会做一些预处理,比如 Chrome 会根据历史统计来预估所输入字符对应的网站,例如输入goog,根据之前的历史发现 90% 的概率会访问「ww…...
PyTorch学习笔记:nn.ReLU——ReLU激活函数
PyTorch学习笔记:nn.ReLU——ReLU激活函数 torch.nn.ReLU(inplaceFalse)功能:逐元素应用ReLU函数对数据进行激活 函数方程: ReLU(x)(x)max(0,x)ReLU(x)(x)^\max(0,x) ReLU(x)(x)max(0,x) 输入: inplace:是否改变输…...
同步线程
↵ 由于这节内容资料比较少,所以以下内容总结自Qt官方文献,在文章最后会给出相应链接。 线程的目的是允许并行运行,但有时线程必须停止等待其他线程。例如,如果两个线程尝试访问同一个变量,这样的话结果是未定义的。强…...
服务端返回内容跨域CORS之后,也在chrome/edge浏览器里显示出响应信息
由于浏览器的同源策略,服务端返回的内容跨域,且没有允许跨域CORS的请求头之后,浏览器无法显示出服务端返回的信息,不方便问题排查。比如:Access to XMLHttpRequest at http://localhost:6001/service-app/query/common…...
DHCP中继及配置
为什么需要DHCP Relay?产生背景解决方案DHCP Relay工作原理DHCP Relay配置实现产生背景 随着网络规模的扩大,网络中就会出现用户处于不同网段的情况。 这个时候客户A和客户B要请求IP地址时,首先会发送DHCP Discover广播包,这个广…...
中国社科院与美国杜兰大学金融管理硕士,让我们相遇在春暖花开时
在芸芸众生中,能拥有志同道合的朋友是一件多么幸运的事。人们常说:你是谁,就会遇见谁。走过半生才知道,看似命中注定的遇见谁、发生的事,其实都取决于自己。只有自己足够优秀,才能遇到更优秀的别人。在这个…...
MySQL---单表查询、多表查询
一、单表查询 素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 v…...
3年自动化测试这水平?我还不如去招应届生
公司前段缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。看简历很多都是3年工作经验,但面试…...
5 个自定义 React Hooks 将改变你的代码
昨天完成我的每日文章(是的,我每天都会发布一篇关于前端开发的新文章,所以如果你想要每天的代码丸,请务必关注 😉),我去编码了一点......我开始为我正在构建的副项目编写一些自定义挂钩…...
Java学习笔记-03(API阶段)
前言 目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢? 其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~ API API(Application Programming Interface,应用程序接口)是一些预…...
Django自定义模板标签的使用详解
目录 1.创建子应用:python manage.py startapp test01 2.进行相关的配置 3.在新建的test01文件下创建urls.py(此处名称可变但注意上图) 4.在test01文件下创建名称为templatetags的文件夹 5.templatetags文件下继续创建几个py文件如下图编辑 6.views视图函数…...
洗地机怎么选?洗地机品牌排行榜
洗地机的出现不仅能高效的清洁地面还能节省我们做家务的时间,对于上班族、有宠物的家庭以及宝妈来说简直不要太方便;目前市面上的洗地机有分有线款和无线款,无线款会比有线款操作更加方便;洗地机怎么选,其实洗地机的清洁能力主要是看吸力大小…...
CSS的元素显示模式
😊博主页面:鱿年年 👉博主推荐专栏:《WEB前端》👈 💓博主格言:追风赶月莫停留,平芜尽处是春山❤️ 目录 前言 一、什么是元素显示模式 1.1块元素 1.2行内元素 1.3行内块元素…...
【MySQL Shell】8.9.1 在 InnoDB ClusterSet 中隔离集群
在发生紧急故障切换后,如果 ClusterSet 的各个部分之间存在事务集不同的风险,则必须保护集群不受写入流量或所有流量的影响。 如果发生网络分区,则有可能出现脑裂的情况,即实例失去同步,无法正确通信以定义同步状态。…...
Ubuntu20.04+cuda11.2+cudnn8.1+Anaconda3安装tensorflow-GPU环境,亲测可用
(1)安装nvidia显卡驱动注意Ubuntu20.04和Ubuntu16.04版本的安装方法不同,安装驱动前一定要更新软件列表和安装必要软件、依赖(必须)sudo apt-get update #更新软件列表sudo apt-get install gsudo apt-get install gccsudo apt-get install make查看GP…...
剑指Offer 第27天 JZ75 字符流中第一个不重复的字符
字符流中第一个不重复的字符_牛客题霸_牛客网 描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go" 时,第一个只出现一次的字符是 "g" 。当从该字符流中读出前六个字符 “google&…...
科研试剂供应1476737-97-9,Bis-PEG2-endo-BCN可发生点击反应
●外观以及性质:Bis-PEG2-endo-BCN一般为白色固体,BCN其为点击试剂,点击化学(Click chemistry),又译为“链接化学”、“动态组合化学” (Dynamic Combinatorial Chemistry)、“速配接…...
Zabbix 构建监控告警平台(一)--部署安装
监控对象监控收集信息方式Zabbix 部署 1.监控对象 源代码: *.html *.jsp *.php *.py 数据库: MySQL,MariaDB,Oracle,SQL Server,DB2 应用软件:Nginx,Apache,PHP,Tomcat agent 集群: LVS,Keepalived,HAproxy…...
【nodejs】nodejs入门核心知识(命令行使用、内置模块、node 模块化开发)
💻 nodejs入门核心知识(命令行使用、内置模块、node 模块化开发) 🏠专栏:JavaScript 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享…...
5. Spring 事务
文章目录1. Spring 事务简介2. Spring 事务角色3. Spring 事务属性3.1 事务配置3.2 案例:转账业务追加日志3.3 事务传播行为1. Spring 事务简介 Spring 事务作用:在数据层或业务层保障一系列的数据库操作同成功、同失败。 数据层有事务我们可以理解&am…...
网站建设分析报告/搜一搜
note:本文短代码实现环境:win10,python3 本文代码执行情况 python打开浏览器方法一: 通过引用os包,调用system方法调用系统的ie程序来打开网址 代码如下: import os os.system("C:/Program Files/Internet Explorer/iexplore…...
兼职做页面的网站/谷歌排名优化
InnoDB中的多版本并发控制(MVCC) MVCC (Multiversion Concurrency Control),多版本并发控制。 顾名思义, MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一…...
最专业的网站建设价格/看广告收益最高的软件
矩阵分析之 实矩阵分解(1)特征分解与奇异值分解前言特征分解(又称谱分解、对角化)奇异值分解SVDSVD的进一步理解前言 本篇开始学习记录矩阵分解内容。需要说明的是,目前我所触及的矩阵基本上没有出现复数域࿰…...
做网站需要编程?/清远疫情防控措施
spark入门实战http://www.cnblogs.com/shishanyuan/p/4699644.html转载于:https://blog.51cto.com/wilsonking/1747157...
如何做聚合类网站/全面网络推广营销策划
最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也…...
网站一年的 运营费用/百度注册公司地址
var tiles L.tileLayer(http://{s}.tile.osm.org/{z}/{x}/{y}.png, {attribution: © <a href"http://osm.org/copyright">OpenStreetMap</a> contributors, }).addTo(map);...