openfire学习笔记(一)系统启动流程

读源码,从找到入口开始。Openfire源码的入口类在org.jivesoftware.openfire.starter包中,目录结构如下:

org.jivesoftware.openfire.starter

|–JiveClassLoader.java

|–ServerStarter.java


在ServerStarter中,找到了经典的main:

public static void main(String [] args) {
new ServerStarter().start();
}



Start()的流程也颇为明了,一眼望去,除了判断一些异常情况外,主要做了解压压缩的库文件、加载核心服务类(XMPPServer)的操作:
解压工作:unpackArchives() 函数完成;
加载类:JiveClassLoader类完成,该类继承于java提供的类加载器 URLClassLoader,拓展内容是对于加载的文件进行了过滤,只处理zip包与jar包,在加载XMPPServer类之前,预处理了库文件的加载,之后又调用了XMPPServer的实体获取方法:

//加载器初始化 库预处理
ClassLoader loader = new JiveClassLoader(parent, libDir);
Thread.currentThread().setContextClassLoader(loader);
//核心服务类
Class containerClass = loader.loadCl("org.jivesoftware.openfire.XMPPServer");
//获取实体
containerClass.newInstance();

这样,通过入口类的加载器,程序运行到核心服务类——XMPPServer,这里才是系统启动的核心实现。
先大概看一下它的私有成员,除了一些标志、数据存储变量和常量以外,可以称得上是工具类型的成员的只有以下几个:

private ClassLoader loader;

private PluginManager pluginManager;
private InternalComponentManager componentManager;
private RemoteSessionLocator remoteSessionLocator;

类加载器自不必说,剩下的倒应该是主要功能相关:plugin、component、remote。
从构造看起,又发现了熟悉的start(),基本流程如下:
初始化:

1.initialize() ;//初始化变量、缓存

2.module 处理:

//加载模块
loadModules();
// Initize all the modules
initModules();
// Start all the modules
startModules();

3.加载pulgin:pluginManager.start();
4.开各路监听接口:

// Notify server listeners that the server has been started
for (XMPPServerListener listener : listeners) {
    listener.serverStarted();
}

该加载的加载了,该监听的监听了,系统的启动基本也就完成了。

相关代码设计:

设计方面没什么出奇的地方,下面是module类型的部分类图,所有module性质的功能模块都实现了这个接口,从而达到统一启动流程的目的。

pluginManager 实现了插件管理的功能,启动过程中加载插件的工作由它完成,内容比较多,后续使用插件相关的功能时再仔细分析。

感谢您赏个荷包蛋~