- 浏览: 261957 次
- 性别:
- 来自: 多伦多
文章分类
- 全部博客 (127)
- Java 基础 (46)
- Java EE (3)
- Clouds (1)
- Spring 编程 (7)
- Spring Batch 编程 (1)
- Quartz 编程 (9)
- Seam 编程 (4)
- Hibernate 编程 (1)
- JSF 编程 (3)
- jQuery 编程 (3)
- Interview Question 汇总 (3)
- 日常应用 (3)
- Maven 编程 (2)
- WebService 编程 (10)
- Scala 编程 (5)
- Coherence 编程 (8)
- OO 编程 (1)
- Java 线程 (6)
- DB 编程 (2)
- WebService 安全 (4)
- Oracle Fusion 编程 (2)
- JavsScript/Ajax 编程 (1)
最新评论
-
chainal:
赞,说的很好
Scala 有趣的Trait -
wuliupo:
RRRR-MM-DD HH24:MI:SS
如何让Oracle SQL Developer显示的包含在日期字段中的时间 -
pengain:
...
使用Spring Roo ,感受ROR式的开发 -
zeng1990:
def getPersonInfo() = {
(&quo ...
Java 的继位人? - Scala简介 -
zeng1990:
我使用的是2.9.2版本的!
Java 的继位人? - Scala简介
(转自: 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 服务器配置的名称,预定义的有三种,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 必须在启动的过程中搜索并加载服务器类。
搜索并加载服务器实例类的工作由一个辅助类完成,它的全限定类名是 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 规范没有规定
发表评论
-
设计模式之事务处理
2010-11-25 07:36 913转自 http://www.blogjava.net/kill ... -
设计自己的MVC框架(1)
2010-11-25 07:27 1252转自 http://www.blogjava.net/ ... -
设计自己的MVC框架(2)
2010-11-25 07:24 1178转自 http://www.blogjava.ne ... -
使用Annotation设计持久层
2010-11-25 06:59 956(From http://www.blogjava. ... -
Jakarta Commons StringUtils类使用
2010-11-25 06:58 935转自http://www.blogjava.net/ ... -
Jakarta Commons ArrayUtils类使用
2010-11-25 06:57 1133转自http://www.blogjava.net/ ... -
Reflection的三个动态性质
2010-11-25 06:56 1013转自http://www.blogjava. ... -
用commons.fileupload实现文件的上传和下载
2010-11-25 06:55 1401转自http://www.blogjav ... -
JAVA基础:共享内存在Java中的实现和应用
2010-11-25 06:54 874(转自 http://www.bu ... -
JAVA变量类型之间的相互转换
2010-11-25 06:52 899(转自 http://www.builder.c ... -
优秀Java程序员必须了解的GC工作原理
2010-11-25 06:52 889(转自 http://www.build ... -
几种版权信息详解
2010-11-25 06:49 1132BSD开源协议(original ... -
Java JDK 1.4 JCE Provider issue.
2010-11-25 06:48 1175Bundled JCE provider in jdk1 ... -
Why use Map.entrySet() instead of Map.keySet()?
2010-11-25 06:45 1394(From http://www.coderan ... -
Credit Card Mod10 校验
2010-11-25 06:27 2077以下是几种Mod10的实现。第一种最为简洁,最后一种 ... -
如何知道方法的调用者
2010-11-25 05:57 7399转自http://hellboys.bok ... -
Java加解密的基础
2010-11-25 05:49 2821在Java的安全包中,包括了三部分内容: ... -
Java日志框架:SLF4J, Apache Common-Logging, Log4J和Logback
2010-11-25 05:47 1859Log4j Apache的一个开放源代码项目,通过 ... -
Java SE 6新特性:Instrumentation
2010-11-25 05:35 1076(转自http://baike.baidu.com ... -
JAVA性能优化—Sun Hotspot JDK JVM参数设置
2010-09-11 00:18 1206(转自: http://www.hashei.me/2009/ ...
相关推荐
在本文中,我们将深入探讨JBoss的启动过程及其相关知识点。 1. **JBoss目录结构**: JBoss的安装目录包含多个子目录,如`bin`、`server`、`deploy`等。`bin`目录下有启动和停止服务器的脚本,`server`目录则包含了...
【JBoss5加载项目完整过程】 JBoss5.1.0.GA是一个成熟的Java应用服务器,用于部署和管理Web应用程序。在这个过程中,最常见的部署格式是WAR(Web Application Archive),它是一个包含所有必要资源和配置的压缩文件...
**JBoss启动顺序** JBoss的启动过程大致分为以下几个阶段: 1. **环境准备**:首先,JBoss会检查运行环境,包括Java环境(JDK)是否安装正确,版本是否兼容,以及相关的系统变量如JAVA_HOME是否设置。 2. **配置...
1.2.2 JBoss启动 启动JBoss服务器,可以通过命令行进入JBoss的安装目录,然后执行`bin/standalone.sh`或`bin/domain.sh`。在Linux环境下,需要赋予这些脚本执行权限。 1.3 JMX控制台 JBoss使用JMX(Java Management...
JBoss启动的入口 一旦启动脚本成功执行,将调用`C:\Java\bin\java`命令,启动Java虚拟机并加载`org.jboss.Main`类中的`main`方法作为启动入口。`Main.main`方法会创建一个名为“jboss”的线程组,并在该线程组中...
在IT领域,特别是Java应用服务器环境下,JBoss与MySQL数据库的集成是常见需求之一,而JNDI(Java Naming and Directory Interface)在此过程中扮演着关键角色。本文将深入解析如何在JBoss中配置MySQL的JNDI数据源,...
- lib目录:JBoss启动时加载的一般JAR文件,这些JAR文件可供所有配置共享。 - server目录:包含服务器配置文件,每个配置有独立的子目录。 - server/all目录:JBoss的完整配置,启动所有服务,包括集群和IIOP。 - ...
模块化系统是JBoss AS7的核心特性之一,它允许服务器以模块化的方式组织,各个模块之间相互独立,可以根据需要加载或卸载,这样既节省了系统资源又提高了应用服务器的启动速度。此外,JBoss AS7支持热部署,这意味着...
- `lib`:JBoss启动时加载的共享JARs,不建议在此处添加自定义库。 - `server`:包含不同配置的子目录,如`minimal`、`default`和`all`。默认使用`default`配置。 - `server/all`:全功能配置,包含集群和IIOP服务...
启动时,JBoss5首先会加载一个名为`ProfileServiceBootstrap`的类,该类内部包含了Microcontainer的初始化过程。初始化过程中,`ProfileServiceBootstrap`会读取`conf/bootstrap-beans.xml`配置文件,并利用XML ...
查看命令行输出的信息,如果看到类似 “JBoss started in...” 的消息,则表示JBoss启动成功。也可以通过浏览器访问默认管理界面(通常是 `http://localhost:8080` 或 `http://localhost:8080/management`),查看...
5. lib:一些 JAR,JBoss 启动时加载,且被所有 JBoss 配置共享。 6. server:各种 JBoss 配置。每个配置必须放在不同的子目录中。子目录的名字表示配置的名字。JBoss 包含 3 个默认的配置:minimial、default 和 ...
2. 内存中的类加载器:通过优化类加载机制,实现更快的应用启动和更小的内存占用。 3. 基于AIO的网络栈:采用异步I/O模型,提供高性能的网络通信能力。 4. 更快的部署:JBoss AS7支持热部署,可以快速地更新应用程序...
更改jsp文件不用再频繁关闭、启动jboss." 提到,当开发者修改了JSP(JavaServer Pages)文件后,不再需要重复地停止和启动JBoss服务。这是因为热部署机制能够检测到文件变更,并自动重新加载这些更改,确保应用能够...
因此,JBoss MC作为一种轻量级的选择,特别适合于那些需要快速启动且资源占用较少的应用场景。 ##### 1.2 与PicoContainer的区别 与PicoContainer等其他容器相比,JBoss MC具有以下特点: - **更轻量级**:JBoss ...
conf目录存放各种配置文件,如jboss-service.xml等,这些文件在服务器启动时加载且通常需要重启服务器才能生效;deploy目录则用于放置应用和服务的部署包,任何对该目录的更改都会立即反映在运行中的服务器上;lib...
在实际应用中,通常需要将这些jar包添加到项目的类路径中,或者在JBoss的lib目录下,以确保它们在应用启动时被正确加载。 在开发过程中,为了确保最佳的兼容性和性能,开发者还应该注意以下几点: 1. 确保使用的...