`

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启动 JBoss启动

    在本文中,我们将深入探讨JBoss的启动过程及其相关知识点。 1. **JBoss目录结构**: JBoss的安装目录包含多个子目录,如`bin`、`server`、`deploy`等。`bin`目录下有启动和停止服务器的脚本,`server`目录则包含了...

    关于JBoss5加载项目的完整过程以及相关错误解决

    【JBoss5加载项目完整过程】 JBoss5.1.0.GA是一个成熟的Java应用服务器,用于部署和管理Web应用程序。在这个过程中,最常见的部署格式是WAR(Web Application Archive),它是一个包含所有必要资源和配置的压缩文件...

    JBOSS启动顺序、JBOSS占用的端口

    **JBoss启动顺序** JBoss的启动过程大致分为以下几个阶段: 1. **环境准备**:首先,JBoss会检查运行环境,包括Java环境(JDK)是否安装正确,版本是否兼容,以及相关的系统变量如JAVA_HOME是否设置。 2. **配置...

    JBoss启动与运行过程的研究

    1.2.2 JBoss启动 启动JBoss服务器,可以通过命令行进入JBoss的安装目录,然后执行`bin/standalone.sh`或`bin/domain.sh`。在Linux环境下,需要赋予这些脚本执行权限。 1.3 JMX控制台 JBoss使用JMX(Java Management...

    JBoss Application Server的启动过程

    JBoss启动的入口 一旦启动脚本成功执行,将调用`C:\Java\bin\java`命令,启动Java虚拟机并加载`org.jboss.Main`类中的`main`方法作为启动入口。`Main.main`方法会创建一个名为“jboss”的线程组,并在该线程组中...

    jboss配置MySql的JNDI

    在IT领域,特别是Java应用服务器环境下,JBoss与MySQL数据库的集成是常见需求之一,而JNDI(Java Naming and Directory Interface)在此过程中扮演着关键角色。本文将深入解析如何在JBoss中配置MySQL的JNDI数据源,...

    在jboss上部署web应用

    - lib目录:JBoss启动时加载的一般JAR文件,这些JAR文件可供所有配置共享。 - server目录:包含服务器配置文件,每个配置有独立的子目录。 - server/all目录:JBoss的完整配置,启动所有服务,包括集群和IIOP。 - ...

    Jboss7官方手册

    模块化系统是JBoss AS7的核心特性之一,它允许服务器以模块化的方式组织,各个模块之间相互独立,可以根据需要加载或卸载,这样既节省了系统资源又提高了应用服务器的启动速度。此外,JBoss AS7支持热部署,这意味着...

    jboss的配置

    - `lib`:JBoss启动时加载的共享JARs,不建议在此处添加自定义库。 - `server`:包含不同配置的子目录,如`minimal`、`default`和`all`。默认使用`default`配置。 - `server/all`:全功能配置,包含集群和IIOP服务...

    JBoss5部署原理

    启动时,JBoss5首先会加载一个名为`ProfileServiceBootstrap`的类,该类内部包含了Microcontainer的初始化过程。初始化过程中,`ProfileServiceBootstrap`会读取`conf/bootstrap-beans.xml`配置文件,并利用XML ...

    怎么配置JDK和JBOSS

    查看命令行输出的信息,如果看到类似 “JBoss started in...” 的消息,则表示JBoss启动成功。也可以通过浏览器访问默认管理界面(通常是 `http://localhost:8080` 或 `http://localhost:8080/management`),查看...

    JBoss篇:安装与配置

    5. lib:一些 JAR,JBoss 启动时加载,且被所有 JBoss 配置共享。 6. server:各种 JBoss 配置。每个配置必须放在不同的子目录中。子目录的名字表示配置的名字。JBoss 包含 3 个默认的配置:minimial、default 和 ...

    JBoss AS7教程

    2. 内存中的类加载器:通过优化类加载机制,实现更快的应用启动和更小的内存占用。 3. 基于AIO的网络栈:采用异步I/O模型,提供高性能的网络通信能力。 4. 更快的部署:JBoss AS7支持热部署,可以快速地更新应用程序...

    jboss 热部署必须jar

    更改jsp文件不用再频繁关闭、启动jboss." 提到,当开发者修改了JSP(JavaServer Pages)文件后,不再需要重复地停止和启动JBoss服务。这是因为热部署机制能够检测到文件变更,并自动重新加载这些更改,确保应用能够...

    JBoss MicroContainer分析及应用

    因此,JBoss MC作为一种轻量级的选择,特别适合于那些需要快速启动且资源占用较少的应用场景。 ##### 1.2 与PicoContainer的区别 与PicoContainer等其他容器相比,JBoss MC具有以下特点: - **更轻量级**:JBoss ...

    Apache与Jboss负载均衡教程

    conf目录存放各种配置文件,如jboss-service.xml等,这些文件在服务器启动时加载且通常需要重启服务器才能生效;deploy目录则用于放置应用和服务的部署包,任何对该目录的更改都会立即反映在运行中的服务器上;lib...

    jboss jar包snowdrop-vfs.jar和jboss-logging.jar

    在实际应用中,通常需要将这些jar包添加到项目的类路径中,或者在JBoss的lib目录下,以确保它们在应用启动时被正确加载。 在开发过程中,为了确保最佳的兼容性和性能,开发者还应该注意以下几点: 1. 确保使用的...

Global site tag (gtag.js) - Google Analytics