`

JBOSS 启动 加载 过程

阅读更多

(转自: http://blog.csdn.net/ylli_800/archive/2009/10/30/4748656.aspx )

 

本文以 JBoss Application Server 4.2.1 GA (以下简称 JBoss )为例,介绍它在 Windows 平台上的启动过程。为了方便叙述,对平台环境做以下假定: Java 运行时的安装路径为 C:\Java JBoss 的安装路径为 C:\JBoss

既然用 100% Java 编写的 JBoss 具有跨平台的特性,那为什么还要强调 Windows 平台呢?这是因为, JBoss 的启动是从平台相关的脚本文件开始的,而在不同平台上的脚本文件是不同的。例如, Window 平台上的脚本文件是 run.bat linux 平台上的脚本是 run.sh 。两个文件的内容有很大不同,功能也许差不多,无非是配置启动环境,但是也有可能存在平台相关的因素。我只看了 run.bat ,对 run.sh 并不了解,为谨慎起见,我只介绍 run.bat ,对 run.sh 不作阐述。

在介绍 JBoss 启动过程之前,我想先介绍一下 JBoss 的结构特征,这将有利于大家理解启动过程。 JBoss 基于 JMX 框架,它的结构就是一个 MBeanSserver 以及一些挂在 MBeanServer 上的 MBean MBean 提供功能, MBeanServer MBean 之间的通信总线。 JMX 框架的好处就是给 JBoss 带来了高度的灵活性、可配置性。可配置性也是 JBoss 的核心理念之一,几乎所有的 JBoss 部件都可以被替换。 JBoss 通过系统属性、配置文件等多种方法,帮助实现高度的可配置性。我们可以通过设置系统属性,或者通过编辑配置文件,来定制自己的 JBoss 版本。这种可配置性体现在 JBoss 的各个角落,启动过程只能窥一斑,若欲知全豹,可以研究一下 JBoss EJB 容器等其它部件。

介绍完 JBoss 的结构特征,我们开始进入 JBoss 的启动过程。整个过程可以分为六个阶段,下面将依次介绍。

      

  一、 执行启动脚本,配置启动环境

JBoss 的启动过程从执行 run.bat 开始, run.bat 的主要工作就是配置启动环境。

JBoss 的启动环境其实是一些启动参数,例如 JBoss 的安装路径、 java 命令的参数、 JBoss 的类路径等。

如果在配置过程中发生错误, run.bat 的执行将被中断。

run.bat 将配置以下启动参数:

JBOSS_HOME

JBoss 的安装路径,其值为 C:\JBoss

PATH

C:\JBoss\bin\native 添加到 PATH 中, native 下的文件是平台相关的,可以优化 JBoss 的性能。

JAVA

java.exe 文件的路径,其值为 C:\Java\bin\java

JAVA_OPTSB

java 命令的参数,其值为 -Dprogram.name=run.bat –server-Xms128m –Xmx512m –Dsun.rmi.dgc.client.gcInterval=3600000 –Dsun.rmi.dgc.server.gcInterval=3600000

JBOSS_CLASSPATH

JBoss 的启动类路径,其值为 C:\Java\lib\tools.jar;C:\JBoss\bin\run.jar JBoss 的启动前期需要的类文件都在这两个 jar 中。

如果没有设置系统环境变量 JAVA_HOME ,那么 run.bat 的执行将被中断, JBoss 启动失 败。因此,在安装好 JBoss 后,一定要设

JAVA_HOME 系统环境变量。

如果 run.bat 执行顺利,那么在最后,将会执行以下命令:

C:\Java\bin\java -Dprogram.name=run.bat –server-Xms128m –Xmx512m –Dsun.rmi.dgc.

client.gcInterval=3600000 –Dsun.rmi.dgc.client.gcInterval=3600000   -Djava.endorsed.dirs=

C:\JBoss\lib\endorsed –classpath C:\Java\lib\tools.jar;C:\JBoss\bin\run.jar org.jboss.Main\%*

%* 代表 run.bat 后面的启动参数。

从这条命令开始,真正运行 JBoss 的代码。

 

        二、 JBoss 启动的入口

JBoss 的魔术从 Main.main 方法开始。 Main 这个类位于 run.jar 中。 Main.main 方法创建了一个名为 ”jboss” 的线程组,然后创建并运行该线程组的线程 ”main” ”main” 线程开始运行后, Main.main 方法执行完毕,主线程也随之结束。 ”main” 线程的主要工作是调用 Main.boot 方法。

Main.boot 方法的主要工作是处理命令行参数,然后创建并运行一个服务器实例。当服务器实例开始运行后, jboss 的启动过程也就成功结束了。下面的几个阶段都是 boot 方法的执行过程。

 

       三、 处理命令行参数

boot 方法调用 Main.processCommandLine 方法,来处理命令行参数。这里的命令行参数其实就是 main 方法的 args 参数,它作为实参传递给 processCommandLine 方法。

processCommandLine 方法使用了 GNU-getopt 程序 包来解析命令行参数,对不同的命令行参数有不同的处理方式,简单概括如下:

部分参数被简单处理后,程序直接退出。这些参数包括:

-h 显示帮助消息。

-V 显示版本信息。版本信息从 run.jar 中的 MANIFEST.MF 文件中获得。

部分参数被保存在服务器属性( Main.props )中,这些参数包括:

-p 补丁目录。

-n 网络启动的 url

-c 服务器配置的名称,预定义的有三种,minimaldefaultall 。当然也可以自定义。

-b 所有 JBoss 服务绑定的地址,如果需要从其它机器访问JBoss 服务,则必须配置该参数。

-g HA 分区的名称

-u UDP 多播地址

部分参数被保存在 Main 的成员变量中,这些参数包括:

-d 启动补丁目录                    保存在 URL bootURL

-B 添加到启动类路径的额外的库       保存在 List bootLibraries

-L 添加到类加载路径的额外的库      保存在 List extraLibraries

-C 添加到类加载路径的额外的 url  保存在 List extraClasspath

部分参数被保存在系统属性中,这些参数包括:

-D 系统属性

-P 从给定 url 加载的属性

-l 指定 日志插件类性,目前有log4jjdk 两种。

         processCommandLine 方法执行完毕后 boot 方法将加载、创建并运行一个服务器实例。

 

       四、 加载并创建服务器实例

 

服务器实例是一个运行时对象,这个对象代表了运行着的 JBoss 应用服务器。启动一个 JBoss 应用服务器,就会有一个服务器实例与

之对应。在 JBoss 中,服务器实例的实现是可以配置的,也就是说,服务器类不是固化的,而是可以替换的。这就带来一个问题:

JBoss 必须在启动的过程中搜索并加载服务器类。

搜索并加载服务器实例类的工作由一个辅助类完成,它的全限定类名是 o rg.jboss.system.server.ServerLoader 这个类会创建

一个特定的类加载器,并使用这个类加载器加载服务器类,然后利用反射机制,创建一个服务器实例。

boot 方法首先创建一个 ServerLoader 实例,我们把它称为 loader ,然后 boot 方法将一些 url 添加到 loader 中。我们把这些 url 称为

服务器搜索路径。 loader 就是在服务器搜索路径中搜索服务器类。服务器搜索路径包括:

bootURL            -d 参数提供。如果 bootURL 是文件目录,则其下的 jar url 也被添加。

bootLibraries    -B 参数提供。

Endorsed jars    位于 C:\JBoss\lib\endorsed 下的所有 jar 包。

jmxLibs            C:\JBoss\lib\jboss-jmx.jar

concurrentLib    C:\JBoss\lib\concurrent.jar

extraLibraries   -L 参数提供。

extraClasspath   -C 参数提供。

loader 自带的 url        log4j-boot.jar jboss-common.jar jboss-system.jar jboss-xml-binding.jar

添加完 服务器搜索路径 后, boot 方法调用了 loader load 方法。 load 方法以 服务器 搜索路径 作为参数,创建一个类加载器,并使用

它搜索和加载服务器类。如果成功加载,就利用放射机制,创建一个服务器实例,我们把它称为 server

默认的服务器类是 org.jboss.system.server.ServerImpl ,它位于 C:\JBoss \lib\jboss-system.jar 中,并不在 jboss 的类路径 

中。因此, loader 必须创建自己的类加载器,使用 服务器搜索路径 作为类搜索路径,才 能够找到 ServerImpl 。通过设置

jboss.server.type 系统属性,也可以使用自定义的服务器类。当然,前提是要保证自定义的服务器类的类文件要在服务器搜索路

径中。

        服务器实例创建完毕后,还需要对它进行配置,这就是下面的初始化工作。

 

      五、 初始化服务器实例

 

       初始化服务器实例的主要工作就是将服务器配置信息封装到一个对象中。这个对象是类  

       org.jboss.system.server.ServerConfigImpl 的实例。它包括了服务器实例的基本配置信息,例如 JBoss 的安装路径、服务器的根

       目录、服务器的日志目录、服务器的临时目录、服务器的库路径等。

boot 方法调用 server init 方法,开始初始化工作。 Init 方法将初始化工作委派给 server. .doInit 方法。 doInit 方法创建并配置 ServerConfigImpl 对象,并在最后在控制台和日志中打印出服务器的配置信息。

ServerConfigImpl 对象是一个 MBean ,因此,用户可以利用 jmx 控制台查看服务器实例的配置信息。

初始化完毕后,就要启动服务器实例了。

 

      六、 启动服务器实例

     

      启动服务器实例是一个复杂的过程,其中有很多的工作需要完成。前面已经提到, JBoss 是基于 JMX 框架的, JBoss 的主要功能都是

      以 MBean 的形式作为服务提供的,服务之间利用 JMX 总线进行通信。直到目前为止,我们还没有看到 JMX 相关的工作。因此,在服务

      器实例的启动过程中,首要的工作就是要搭建 JMX 框架。 JMX 框架搭建完毕后, JBoss 需要创建几个基本的服务,这些服务正是以  

       MBean 的形式,挂在 JMX 框架上。之后, JBoss 开始了部署过程。 JBoss 预配置的服务、用户的部署单元都在这个阶段被部署、启动。

boot 方法调用 server.start 方法,开始了启动过程。 start 方法将启动工作委派给了 server. doStart 方法。 doStart 方法依次完成以

下工作:

1. 创建并启动计时器

  这个计时器是用来计算 JBoss 启动的时间, JBoss 启动成功后,会在控制台输出启动过程所耗的时间,背后的秘密就在这里。(这个

  无关紧要,为了完整性介绍一下)。

2. 创建 MBeanServer 实例

   MBeanServer JMX 框架的核心。 JBoss 需要创建一个 MBeanServer 实例。, MBeanServer 的实现也是可以配置的。目前可以

   使用两种 MBeanServer ,一种是 jvm platform MBeanServer ,它是 Java 平台提供的;另一种是 JBoss 提供的,全限定类名为

   org.jboss.mx.server.MBeanServerImpl 。通过设置 javax.management.builder.initial 系统属性,也可以使用自定义

   MBeanServer 。那么 JBoss 究竟使用的是哪种实现呢?如果 Java 版本达到或高于 5.0 ,且 jboss.platform.mbeanserver 系统属

   为 true ,则使用 jvm platform MBeanServer ,否则都使用 JBoss 提供的 MBeanServerImpl 。(这一点说得并不准确,涉及

   LazyMBeanServer ,我还不太清除。大家可以认为,绝大部分情况下,都是用 JBoss 提供的 MBeanServerImpl )。

 

3.  创建并注册基础服务

 

    在创建 MBeanServerImpl 的过程中,会创建以下 3 MBean

        

      第一个 MBean javax.management.MBeanServerDelegate,                ObjectName=JMImplementation:type=MBeanServerDelegate

      第二个 MBean 是一个动态 MBean org.jboss.mx.modelmbean.XMBean, ObjectName=JMImplementation:type=MBeanRegistry

      第三个 MBean org.jboss.mx.loading.UnifiedLoaderRepository3,

       ObjectName=JMImplementation:service=LoaderRepository, name=Default

 

第一个 MBean 是在调用 MBeanServerImpl 之前创建的,后面两个 MBean 实在 MBeanServerImpl 的构造函数中创建的。第二个 MBean 是用来 MBeanServer 的注册表,所有挂在 MBeanServer 上的 MBean 都被注册到注册表中。第三个 MBean JBoss 的类加载架构有关,也是基础服务之一。

 

服务器 server ServerConfigImpl 也都是 MBean ,也都被注册到 MBeanServer ObjectName 分别为 jboss.system:type=Server jboss.system:type=ServerConfig

    然后, doStart 方法创建并注册以下 3 MBean

    第一个 MBean org.jboss.system.server.ServerInfo

             ObjectName= jboss.system:type=ServerInfo

    第二个 MBean org.jboss.system.ServiceController

             ObjectName= jboss.system:service=ServiceController

    第三个 MBean org.jboss.deployment.MainDeployer

             ObjectName= jboss.system:service=MainDeployer

    第一个 MBean 主要封装了 JBoss 运行的软硬件平台的信息,包括主机地址、 J 操作系统版本、 Java 版本等。

    第二个 MBean 是用来控制 MBean 的生命周期。 JMX 规范没有规定

分享到:
评论

相关推荐

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    JBoss Seam 简介......................................................................................................................................................................... 11 Chapter 1. ...

    Hibernate实战(第2版 中文高清版)

     第17章 JBoss Seam简介   17.1 Java EE 5.0编程模型   17.1.1 JSF详解   17.1.2 EJB 3.0详解   17.1.3 用JSF和EJB 3.0编写Web应用程序   17.1.4 分析应用程序   17.2 用Seam改善应用程序   17.2.1 ...

    《MyEclipse 6 Java 开发中文教程》前10章

    6.6.2监控服务器启动过程 103 6.6.3停止服务器 103 6.6.4调试发布的企业应用 104 6.7小结 104 6.8 参考资料 104 第七章 开发Hibernate应用 105 7.1介绍 105 7.2 Hibernate 一览 105 7.2.1简介 105 7.2.2 Hibernate...

    java面试题

    书写EJB要遵循一定的规范,另外要运行EJB,你需要有相应的EJB容器,比如WebLogic、jboss等,而JavaBean不需要,只需要安装Tomcat就可以了。EJB用于服务端的应用开发,而JavaBean用于客户端应用开发。 触发器? 答:...

    MySQL 5.1官方简体中文参考手册

    2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL...

    MySQL 5.1中文手冊

    2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL...

    超级有影响力霸气的Java面试题大全文档

    抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承...

    MySQL 5.1参考手册 (中文版)

    2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL...

    mysql官方中文参考手册

    2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL...

    MYSQL中文手册

    5.1.4. mysql.server:MySQL服务器启动脚本 5.1.5. mysqld_multi:管理多个MySQL服务器的程序 5.2. mysqlmanager:MySQL实例管理器 5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并...

    MySQL 5.1参考手册中文版

    2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装...

    MySQL 5.1参考手册

    2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL...

    java 面试题 总结

    抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类...

    MySQL5.1参考手册官方简体中文版

    2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL...

    ssh(structs,spring,hibernate)框架中的上传下载

    这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...

    mysql5.1中文手册

    以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下...

    JAVA上百实例源码以及开源项目源代码

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    JAVA上百实例源码以及开源项目

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

Global site tag (gtag.js) - Google Analytics