jboss核心启动就是完成对jmx实现的初始化,在没有深入研究jmx的实现之前,我们可以将jmx看成一个类似hashtable的东西,通过给定一个ObjectName, 就能取得相应的对象。
step 1 org.jboss.Main
main.boot(args)
1.
设置
HOME_URL;
2.
创建
ServerLoader
ServerLoader loader = new ServerLoader(props);
3. 添加boot libs、endorsed jars、jmx libs、concurrentlib和 extra libs;
4. 装载Server;
在ServerLoader中定义了默认的Server实现: ServerImpl,Server由NoAnnotationURLClassLoader类装载器装载, 有关类装载器我们在后面深入分析。
5. 初始化并启动Server;
关于run脚本这里就不说明了;
step 2 org.jboss.system.ServerImpl
server.init(props)
1. 构造ServerConfig对象;
2. 初始化logging;
3. 记录config信息;
server.start()
1. 建立MBeanServer
这里有二种情况,如果在当前线程中已经有一个MBeanServer存在了,则Jboss使用这个MBeanServer, 否则创建自己的MBeanServer实现类MBeanServerImpl。
2. 注册服务和服务配置组件
registerMBean方法用于向jmx注册组件,之前我们已经假定jmx是一个类似hashtable的东西,这里可将registerMBean暂时理解为put方法,通过一个key来关联object。
3. 创建ServiceController(服务控制器)
ServiceController负责管理service组件的生命周期,服务组件实现了Service接口。
ServiceController并不会对service组件进行直接操作,因为service组件都注册到了MBeanServer中,ServiceController仅充当了MBeanServer对外的控制角色,使我们能通过它对MBeanServer中的service组件进行生命周期控制。
4. 创建并启动 MainDeployer(主部署器)
MainDeployer负责分发部署内容到合适的SubDeployer上。
5. 创建并启动 JARDeployer(JAR部署器)
JARDeployer负责部署jar单元。
6. 创建并启动 SARDeployer(SAR部署器)
SARDeployer负责部署*-service.xml文档。
7. 启动部署操作
调用MainDeployer的deploy方法开始部署。
step 3 org.jboss.deployment.MainDeployer
作为主部署器,MainDeployer并不能部署任何单元,实际的部署任务由SubDeployer的具体实现类完成,所有的SubDeployer在服务启动后都应通过addDeployer方法其自身注册到MainDeployer中,在step2中,系统已经装载了JARDeployer和SARDeployer两个子部署器。
当MainDeployer部署一个单元时,它遍历访问已注册的SubDeployer,SubDeployer通过accept方法来检查是否能接受部署单元,当返回true时,MainDeployer将部署单元交由此SubDeployer进行部署。
下面来看看实际的部署操作,系统启动后,首先部署conf/jboss-service.xml,根据规则定义*-service.xml由SARDeployer部署。
1. init
初始化
首先通过findDeployer查找合适的SubDeployer,如果找不到则等待,
这里为SARDeployer;
然后调用SARDeployer的init方法进行初始化;
2. create
创建
调用SARDeployer的create方法开始服务组件创建;
首先由ServiceController安装服务组件,在jboss-service.xml中定义的每一个mbean节点都对应为一个服务组件;
然后由ServiceController创建服务组件;
3. start
启动
调用SARDeployer的start方法启动服务组件;
遍历部署单元内的服务组件,并由ServiceController启动它;
在default配置的jboss-service.xml中,定义了以下主要组件:
NamingService: 命名服务;
Log4jService: 日志服务;
JRMPInvoker: 提供rmi方式访问jmx;
URLDeploymentScanner: URL部署扫描器,实现热部署能力;
部署完成后,URLDeploymentScanner扫描器开始监视部署目录的变化,
当内容发生变化时,如一个服务复制到目录或从目录移除时,扫描器调用MainDeployer对其进行部署或卸载。