`

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