openfire学习笔记(三)ConnectionManagerImpl类解析——未完待续

ConnectionManagerImpl 是一个管理协调服务器上各种链接的一个module。

结构关系

下图是ConnectionManagerImpl的类继承实现关系图:

由图可知,该类继承了BasicModule 类,实现了CertificateEventListener 与 ConnectionManager接口。也就是说它本质上是一个module,并且还附加了ConnectionManager和CertificateEventListener的双重属性。

属性和方法

类的私有成员实际上可以认为是一个类要操作的数据,而方法则是数据进行操作的行为的封装。对于ConnectionManagerImpl而言,它的私有成员出去一些简单的标志类型的不谈,主要可以分三种:SocketAcceptor相关的为一种(红线),从上一篇服务器端监听客户端请求的分析可以直到,SocketAcceptor 是信息传递的基础实现,也是MINA工具包提供的基础工具,各路监听器的建立实际上也是对SocketAcceptor类型的私有成员的初始化;第二种是packet相关的工具类实体(蓝线),packet分发、路由等。从上一篇最后的流程图基本可以得出,内部信息的流动这些工具应当是出过力的;第三中则是 SessionManager (绿线)了,会话管理,信息传递到最后基本还是要到Session中的。基本可以猜测,该类的主要功能是链接管理的实现,实际上也是信息传递的一种管理。
对于后两种属性成员,可以稍微查看一下类中的操作位置,进一步了解这些成员的作用:

RoutingTable 类型的routingTable初始化操作之外,把一切都贡献给了createSocketReader 函数:

public SocketReader createSocketReader(Socket sock, boolean isSecure, ServerPort serverPort,
boolean useBlockingMode) throws IOException {
    if (serverPort.isServerPort()) {
        SocketConnection conn = new SocketConnection(deliverer, sock, isSecure);
        return new ServerSocketReader(router, routingTable, serverName, sock, conn,
                useBlockingMode);
    }
    return null;
}


而router与deliverer则命运相似,除了初始化、贡献给createSocketReader函数之外,还作为创建监听器和启动监听器的条件使用;

至于 sessionManager,除了初始化操作,仅仅作为监听器初始化和启动的条件。综上,可以得出以下几点结论:

  1. createSocketReader是核心方法,因为主要数据成员都围绕着这个方法;
  2. 数据成员的初始化都是采用server.getXXX(XMPPServer server)类型获取,说明实体的构建是在XMPPServer完成的;
  3. 大部分数据成员是否为null,是监听器创建与启动的必要条件,而数据成员又是从server获取,也就是说本类的核心功能依赖于服务器的初始化;

成员变量看完了,再把公有方法成员拉出来看看,公有方法一般体现了类对外提供的核心价值,私有方法则一般作为公有方法的内部实现支持,所以在大局观上,看看公有方法是可取的,拉出来分分类,如下:

一共三十几个公有函数,第一种是实现CertificateEventListener 的接口,第二种是实现 ConnectionManager的接口,第三种则是复写Module的几个接口。剩下的屈指可数的几个算是这货自己的公有接口,仔细一看还是若干getter。从接口的情况看,梳理一下该类的核心功能:其一作为Module管理各路监听;其二,管理connection;其三,认证相关的东西。所以说这个类没什么自身的特色,可以说是一个纯管理类。抛开认证方面的CertificateEventListener接口实现暂时不看,从两个核心功能点看起,对于ConnectionManager接口,除去各种setter、getter、enable和isXXXEnable之外,居然只剩下一个createSockerReader,这也符合前面对属性成员分析得出的结论;至于Module复写的接口,短小精悍,直接提取流程即可。

感谢您赏个荷包蛋~