[七]RabbitMQ-客户端源码之AMQPImpl+Method
来源:互联网 发布:远控软件下载 编辑:程序博客网 时间:2024/06/07 05:13
AMQPImpl类包括AMQP接口(public class AMQImpl implements AMQP)主要囊括了AMQP协议中的通信帧的类别。
这里以Connection.Start帧做一个例子。
public static class Connection { public static final int INDEX = 10; public static class Start extends Method implements 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的全部。
附:本系列全集
- [Conclusion]RabbitMQ-客户端源码之总结
- [一]RabbitMQ-客户端源码之ConnectionFactory
- [二]RabbitMQ-客户端源码之AMQConnection
- [三]RabbitMQ-客户端源码之ChannelManager
- [四]RabbitMQ-客户端源码之Frame
- [五]RabbitMQ-客户端源码之AMQChannel
- [六]RabbitMQ-客户端源码之AMQCommand
- [七]RabbitMQ-客户端源码之AMQPImpl+Method
- [八]RabbitMQ-客户端源码之ChannelN
- [九]RabbitMQ-客户端源码之Consumer
欢迎支持笔者新书:《RabbitMQ实战指南》以及关注微信公众号:Kafka技术专栏。
- [七]RabbitMQ-客户端源码之AMQPImpl+Method
- [一]RabbitMQ-客户端源码之ConnectionFactory
- [二]RabbitMQ-客户端源码之AMQConnection
- [三]RabbitMQ-客户端源码之ChannelManager
- [四]RabbitMQ-客户端源码之Frame
- [五]RabbitMQ-客户端源码之AMQChannel
- [六]RabbitMQ-客户端源码之AMQCommand
- [八]RabbitMQ-客户端源码之ChannelN
- [九]RabbitMQ-客户端源码之Consumer
- [Conclusion]RabbitMQ-客户端源码之总结
- RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介
- BT客户端源码分析之七:客户端与tracker通信过程
- RabbitMQ案例七之延时任务
- RabbitMQ 之七 TTL与Dead lettering
- 【OpenStack源码分析之二】RabbitMQ分析
- RabbitMQ学习(七)之ConntectionFactory与Conntection的认知
- RabbitMQ案例七之RPC远程过程调用
- RabbitMQ教程之php-amqplib(七)远程调用
- Activity和Fragment生命周期中的大坑------------
- JavaSE_8系列博客——基础篇(二)——从Hello World 开始说起
- CMAKE的使用
- javaSE_8系列博客——基础篇(一)--让我们开始吧!
- word2vec 中的数学原理详解
- [七]RabbitMQ-客户端源码之AMQPImpl+Method
- 2016河南省第九届ACM程序设计竞赛,问题 E: 机器设备
- LeetCode算法题目:Populating Next Right Pointers in Each Node II
- Java 文件的拷贝
- Leetcode 160 寻找两链表的交叉节点
- 判断101-200之间有多少个素数,并输出所有素数
- 关于找不到trainAutoencoder(自编码)问题
- JavaScript 字符串replace()和replayAll()
- ListView 中 BaseAdapter的使用