当前位置: 首页 > news >正文

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-NameclassIdmethodIdhasContent
Connection.Start1010false
Connection.StartOk1011false
Connection.Secure1020false
Connection.SecureOk1021false
Connection.Tune1030false
Connection.TuneOk1031false
Connection.Open1040false
Connection.OpenOk1041false
Connection.Close1050false
Connection.CloseOk1051false
Connection.Blocked1060false
Connection.Unblocked1061false
Channel.Open2010false
Channel.OpenOk2011false
Channel.Flow2020false
Channel.FlowOk2021false
Channel.Close2040false
Channel.CloseOk2041false
Access.Request3010false
Access.RequestOk3011false
Exchange.Declare4010false
Exchange.DeclareOk4011false
Exchange.Delete4020false
Exchange.DeleteOk4021false
Exchange.Bind4030false
Exchange.BindOk4031false
Exchange.Unbind4040false
Exchange.UnbindOk4051false
Queue.Declare5010false
Queue.DeclareOk5011false
Queue.Bind5020false
Queue.BindOk5021false
Queue.Purge5030false
Queue.PurgeOk5031false
Queue.Delete5040false
Queue.DeleteOk5041false
Queue.Unbind5050false
Queue.UnbindOk5051false
Basic.Qos6010false
Basic.QosOk6011false
Basic.Consume6020false
Basic.ConsumeOk6021false
Basic.Cancel6030false
Basic.CancelOk6031false
Basic.Publish6040true
Basic.Return6050true
Basic.Deliver6060true
Basic.Get6070false
Basic.GetOk6071true
Basic.GetEmpty6072false
Basic.Ack6080false
Basic.Reject6090false
Basic.RecoverAsync60100false
Basic.Recover60110false
Basic.RecoverOk60111false
Basic.Nack60120false
Tx.Select9010false
Tx.SelectOk9011false
Tx.Commit9020false
Tx.CommitOk9021false
Tx.Rollback9030false
Tx.RollbackOk9031false
Confirm.Select8510false
Confirm.SelectOk8511false

相关文章:

RabbitMQ-客户端源码之AMQPImpl+Method

AMQPImpl类包括AMQP接口&#xff08;public class AMQImpl implements AMQP&#xff09;主要囊括了AMQP协议中的通信帧的类别。 这里以Connection.Start帧做一个例子。 public static class Connection {public static final int INDEX 10;public static class Startextends…...

雅思经验(7)

我发现雅思阅读要命的不是难度&#xff0c;而是时间的把控。考试时间是总共一小时&#xff0c;但是要写三篇文章&#xff0c;之后总共40道题目&#xff0c;也就是说每篇文章平均是13.3道。但是他们很多人说&#xff0c;如果誊写答案需要花掉3、4分钟每篇&#xff0c;也就是说真…...

Ubuntu20.04 用 `hwclock` 或 `timedatectl` 设置RTC硬件时钟为本地时区

Ubuntu20.04用 hwclock 或 timedatectl 设置硬件时区为本地时区 可以用hwclock命令 sudo hwclock --localtime --systohc&#x1f446;效果等同&#x1f447; , --localtime的简写是-l ; --systohc的简写是-w sudo hwclock -l -w也可以用timedatectl命令 &#x1f446;效果等…...

大学物理·第15章【量子物理】

黑体 斯特藩玻耳兹曼定律 维恩定律 光电效应 在光照射下 &#xff0c;电子从金属表面逸出的现象&#xff0c;叫光电效应. 逸出的电子&#xff0c;叫光电子 经典理论&#xff1a; 光电流值与入射光强成正比截止频率&#xff08;红限&#xff09;v0对某种金属来说&#xff0c;只有…...

2010-2019年290个地级市经济发展与城市绿化数据

2010-2019年290个地级市经济发展与城市绿化数据 1、时间&#xff1a;2010-2019年 2、来源&#xff1a;城市统计NJ&#xff0c;缺失情况与NJ一致 3、范围&#xff1a;290个地级市 4、指标&#xff1a; 综合经济&#xff1a;地区生产总值、人均地区生产总值、地区生产总值增…...

【CSS 布局】-多列布局

一、两列布局 两列布局&#xff1a;一列定宽(也有可能由子元素决定宽度)&#xff0c;一列自适应的布局。 创建一个父盒子&#xff0c;和子盒子 <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过度&#xff0c;将会初步介…...

Matter 研讨会回顾(第三期)|乐鑫 Matter 免开发方案与证书服务介绍

1 月 17 日&#xff0c;乐鑫举办了以“乐鑫 Matter 免开发方案与证书服务介绍”为主题的第三期 Matter 线上研讨会&#xff0c;介绍乐鑫开箱即用的 ESP-ZeroCode 模组及其免开发 Matter 方案&#xff0c;以及证书生成和预配置相关服务。欢迎观看研讨会的视频回放了解详情。&…...

函数栈帧的创建和销毁——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰来为大家介绍一个知识点——函数栈帧的创建和销毁。其实这个知识点&#xff0c;我们很早之前就要讲&#xff0c;但是因为我的一系列原因&#xff0c;才一直拖到了现在&#xff0c;那么&#xff0c;话不多说&#xff0c;让我们一起…...

腾讯云对象存储+企业网盘 打通数据链“最后一公里

对云厂商和企业用户来说&#xff0c;随着数据规模的快速增长&#xff0c;企业除了对存储功能和性能的要求不断增加&#xff0c;也越来越注重数据分发的效率。在传统数据分发的过程中&#xff0c;数据管理员往往需要先在存储桶下载对应的客户方案/交付资料&#xff0c;再使用微信…...

在浏览器输入url到发起http请求,这过程发生了什么

当用户输入url&#xff0c;操作系统会将输入事件传递到浏览器中&#xff0c;在这过程中&#xff0c;浏览器可能会做一些预处理&#xff0c;比如 Chrome 会根据历史统计来预估所输入字符对应的网站&#xff0c;例如输入goog&#xff0c;根据之前的历史发现 90% 的概率会访问「ww…...

PyTorch学习笔记:nn.ReLU——ReLU激活函数

PyTorch学习笔记&#xff1a;nn.ReLU——ReLU激活函数 torch.nn.ReLU(inplaceFalse)功能&#xff1a;逐元素应用ReLU函数对数据进行激活 函数方程&#xff1a; ReLU(x)(x)max⁡(0,x)ReLU(x)(x)^\max(0,x) ReLU(x)(x)max(0,x) 输入&#xff1a; inplace&#xff1a;是否改变输…...

同步线程

↵ 由于这节内容资料比较少&#xff0c;所以以下内容总结自Qt官方文献&#xff0c;在文章最后会给出相应链接。 线程的目的是允许并行运行&#xff0c;但有时线程必须停止等待其他线程。例如&#xff0c;如果两个线程尝试访问同一个变量&#xff0c;这样的话结果是未定义的。强…...

服务端返回内容跨域CORS之后,也在chrome/edge浏览器里显示出响应信息

由于浏览器的同源策略&#xff0c;服务端返回的内容跨域&#xff0c;且没有允许跨域CORS的请求头之后&#xff0c;浏览器无法显示出服务端返回的信息&#xff0c;不方便问题排查。比如&#xff1a;Access to XMLHttpRequest at http://localhost:6001/service-app/query/common…...

DHCP中继及配置

为什么需要DHCP Relay&#xff1f;产生背景解决方案DHCP Relay工作原理DHCP Relay配置实现产生背景 随着网络规模的扩大&#xff0c;网络中就会出现用户处于不同网段的情况。 这个时候客户A和客户B要请求IP地址时&#xff0c;首先会发送DHCP Discover广播包&#xff0c;这个广…...

中国社科院与美国杜兰大学金融管理硕士,让我们相遇在春暖花开时

在芸芸众生中&#xff0c;能拥有志同道合的朋友是一件多么幸运的事。人们常说&#xff1a;你是谁&#xff0c;就会遇见谁。走过半生才知道&#xff0c;看似命中注定的遇见谁、发生的事&#xff0c;其实都取决于自己。只有自己足够优秀&#xff0c;才能遇到更优秀的别人。在这个…...

MySQL---单表查询、多表查询

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 v…...

3年自动化测试这水平?我还不如去招应届生

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是3年工作经验&#xff0c;但面试…...

5 个自定义 React Hooks 将改变你的代码

昨天完成我的每日文章&#xff08;是的&#xff0c;我每天都会发布一篇关于前端开发的新文章&#xff0c;所以如果你想要每天的代码丸&#xff0c;请务必关注 &#x1f609;&#xff09;&#xff0c;我去编码了一点......我开始为我正在构建的副项目编写一些自定义挂钩&#xf…...

Java学习笔记-03(API阶段)

前言 目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢? 其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~ API API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预…...

长期使用Taotoken的Token Plan套餐在项目开发成本控制上的实际感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Taotoken的Token Plan套餐在项目开发成本控制上的实际感受 1. 从按需付费到计划用量的转变 在AI应用开发的早期阶段&…...

企业内网应用如何安全合规地集成外部大模型API服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业内网应用如何安全合规地集成外部大模型API服务 在构建内部AI工具时&#xff0c;企业开发团队面临一个核心挑战&#xff1a;如何…...

工程师实战:Windows 8工作站部署、驱动危机与专业工具兼容性全解析

1. 从工程师视角看Windows 8的喧嚣与真实2013年&#xff0c;当Windows 8带着那个被称为“Metro”的崭新界面横空出世时&#xff0c;整个科技圈&#xff0c;尤其是我们这些整天和硬件、设计工具打交道的工程师群体&#xff0c;几乎炸开了锅。媒体上充斥着两极分化的评价&#xf…...

手把手教你ClickHouse(二、Windows下Docker部署与可视化实战)

1. Windows下Docker环境准备 在开始部署ClickHouse之前&#xff0c;我们需要先确保Windows系统已经正确配置Docker环境。这里我推荐使用Docker Desktop for Windows&#xff0c;它提供了图形化界面和完整的容器管理功能。安装过程可能会遇到几个常见坑点&#xff0c;我把自己实…...

Hermes Agent项目中集成Taotoken自定义供应商教程

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Hermes Agent项目中集成Taotoken自定义供应商教程 对于使用Hermes Agent框架的开发者而言&#xff0c;直接调用单一模型服务商有时…...

【限时解密】ElevenLabs未公开的“Voice Stability Index”(VSI)指标解析——专业级语音稳定性评估体系首度披露

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;【限时解密】ElevenLabs未公开的“Voice Stability Index”&#xff08;VSI&#xff09;指标解析——专业级语音稳定性评估体系首度披露 VSI 的本质与工程意义 Voice Stability Index&#xff08;VSI&…...

FlareLine Flutter:开源跨平台管理后台模板开发与部署指南

1. 项目概述&#xff1a;一个为现代应用而生的Flutter仪表盘模板如果你正在寻找一个能快速启动你的下一个Web、Android或iOS项目后台管理界面的方案&#xff0c;并且希望这个方案足够现代、功能齐全&#xff0c;同时又能让你完全掌控代码&#xff0c;那么FlareLine Flutter这个…...

如何快速掌握Unitree Go2机器人ROS2开发:面向初学者的完整教程

如何快速掌握Unitree Go2机器人ROS2开发&#xff1a;面向初学者的完整教程 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk Unitree Go2 ROS2 SDK是一个强大的开源项…...

对比按量计费与Token Plan套餐,哪种方式更适合你的项目

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比按量计费与Token Plan套餐&#xff0c;哪种方式更适合你的项目 在接入大模型服务时&#xff0c;成本控制是每个开发者和团队都…...

让 Agent 也能发邮件:Cloudflare Email Service 正式公测

原文&#xff1a;Cloudflare Email Service: now in public beta. Ready for your agents 邮件是世界上最通用的接口 不需要下载特定 App&#xff0c;不需要接入自定义 SDK&#xff0c;不需要注册新平台。全球几十亿人都有邮箱&#xff0c;任何人都可以通过一封邮件和你的应用…...