上面了解一下Method接口和Method抽象类,我们再来了解一下AMQP接口,这个也是AMQP接口确认
- 大概看一下AMQP接口,分两部分常量部分和静态内部类
1、常量
常量名 | 值 | 描述 |
---|---|---|
PROTOCOL.MAJOR | 0 | AQMP协议主版本为0 |
PROTOCOL.MINOR | 9 | AQMP协议次版本为9 |
PROTOCOL.REVISION | 1 | AQMP协议修正版本号为1 |
PROTOCOL.PORT | 5672 | AQMP协议默认端口号为5672 |
FRAME_METHOD | 1 | frame(数据帧)表示方法 |
FRAME_HEADER | 2 | frame(数据帧)表示请求头 |
FRAME_BODY | 3 | frame(数据帧)表示主体 |
FRAME_HEARTBEAT | 8 | frame(数据帧)表示心跳检测 |
FRAME_MIN_SIZE | 4096 | frame(数据帧)最小大小 |
FRAME_END | 206 | frame(数据帧)结束帧 |
REPLY_SUCCESS | 200 | 回复成功 |
CONTENT_TOO_LARGE | 311 | 内容太大 |
NO_ROUTE | 312 | 未路由 |
NO_CONSUMERS | 313 | 没有消费者 |
ACCESS_REFUSED | 403 | 获取拒绝 |
NOT_FOUND | 404 | 未找到 |
RESOURCE_LOCKED | 405 | 资源锁定 |
PRECONDITION_FAILED | 406 | 预检查失败 |
CONNECTION_FORCED | 320 | 强制连接 |
INVALID_PATH | 402 | 无效路径 |
FRAME_ERROR | 501 | frame(数据帧)错误 |
SYNTAX_ERROR | 502 | 语法错误 |
COMMAND_INVALID | 503 | 命令无效 |
CHANNEL_ERROR | 504 | 通道异常 |
UNEXPECTED_FRAME | 505 | 不是预期frame(数据帧) |
RESOURCE_ERROR | 506 | 资源错误 |
NOT_ALLOWED | 530 | 不允许 |
NOT_IMPLEMENTED | 540 | 未实现 |
INTERNAL_ERROR | 541 | 内部异常 |
2、 内部类
- 如下图
2.1、总结
- 每个方法几乎有成对的, xxx 和 xxxOk, 只有basic中publish, return, deliver,getEmpty, ack, reject, recoveryAsync, nack 不是成对
- Connection类对应AMQP的接口方法,start, secure, tune, open, close, blocked方法
- Channel类对应AMQP的接口方法, open, flow, close
- Access类对应AMQP的接口方法,request
- Exchange类对应AMQP的接口方法,declare, delete, bind, unbind
- Queue类对应AMQP的接口方法,declare, delete, bind, unbind,purge
- Basic类对应AMQP的接口方法, qos, consume, cancel, publish ,return,deliver, get, getEmpty, ack, reject, recoveryAsync, recover, nack
- Tx类对应AQMP的接口方法 select, commit, rollback
- Confirm类对应AQMP的接口方法 select
2.2、单个接口方法拆开(以Start为例)
-
每个类都有定义具体成员变量,然后构建Builder构造器进行构建,以Start为例如下所示
-
public interface Start extends Method { int getVersionMajor(); int getVersionMinor(); Map<String,Object> getServerProperties(); LongString getMechanisms(); LongString getLocales(); // Builder for instances of Connection.Start public static final class Builder { private int versionMajor = 0; private int versionMinor = 9; private Map<String,Object> serverProperties; private LongString mechanisms = LongStringHelper.asLongString("PLAIN"); private LongString locales = LongStringHelper.asLongString("en_US"); public Builder() { } public Builder versionMajor(int versionMajor) { this.versionMajor = versionMajor; return this; } public Builder versionMinor(int versionMinor) { this.versionMinor = versionMinor; return this; } public Builder serverProperties(Map<String,Object> serverProperties) { this.serverProperties = serverProperties; return this; } public Builder mechanisms(LongString mechanisms) { this.mechanisms = mechanisms; return this; } public Builder mechanisms(String mechanisms) { return this.mechanisms(LongStringHelper.asLongString(mechanisms)); } public Builder locales(LongString locales) { this.locales = locales; return this; } public Builder locales(String locales) { return this.locales(LongStringHelper.asLongString(locales)); } public Start build() { return new com.rabbitmq.client.impl.AMQImpl.Connection.Start(versionMajor, versionMinor, serverProperties, mechanisms, locales); } } }
-
其实不同方法构建属性可能不一样,都有一个builder构造器,具体build()都是在AMQImpl中
-
具体Method抽象接口实现都是在AMQImpl中
-
其实这个方法是可以借鉴一下,不管具体结果如何我们都是需要构建对象的时候,先在接口定义好构建器,具体方法在实现类去实现。
2.3、BasicProperties 类
- 待续,下篇在分析BasicProperties类源码