本文减少代码展示,重点是理解整体类关系与结构的设计。
因为项目中用rabbitmq,特意了解一下客户端代码。它使用nio的方式也很典型,它并没有使用netty等间接使用nio,毕竟服务端是Erlang开发的,数据传输的结构简单。它使用两个Selector.open()产生的两个selector,分别处理读写的操作注册。写的数据放在一个state的队列中,循环队列注册写操作,并从队列取数据来写。
另外注册nio操作的时候,一般attach参数是一个持有socketChannel的对象,一般demo中直接用socketChannel读写,但实际上一般要先处理后,再读写的。
nio是低层,至于给用户用的connection是统一读写用,毕竟客户端只是一个socketChannel,而用户的channel是编号的,给用户的独立线程使用的,最终还是通过connection进行读写。
代码多了也记不住,仅画一个图:分别体现了运行状态 与 构建运行状态的主要操作。

**运行状态图:**来源于框架的要实现的功能,可以从作者提供的示例作为入口进行功能跟踪。
ConnectionFactory factory = new ConnectionFactory();
…
Connection conn = factory.newConnection();
这里最终就是通过nio(实际上支持非nio,SSL也可选)发送(接收)消息或者命令。
通过以上分析,差不多就整理出一个运行时状态图。
**构建运行状态:**源于对上述运行中的类的创建、初始化、关联起来。按上述运行中的引用关系创建,不是一个new就能说明,所以一般都要有工厂。
总的来说,rabbitmq-client源码还有很多特点,比如使用nio或bio,使用ssl或者非ssl,使用nio的读写分开的selector。这些处理都很有实站参考价值。