`

JBOSS 启动 加载 过程

    博客分类:
  • java
阅读更多
    本文以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 服务器配置的名称,预定义的有三种,minimal、default和all。当然也可以自定义。

-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 指定日志插件类性,目前有log4j和jdk两种。

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



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



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

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

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

搜索并加载服务器实例类的工作由一个辅助类完成,它的全限定类名是org.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规范没有规定



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ylli_800/archive/2009/10/30/4748656.aspx
0
0
分享到:
评论

相关推荐

    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