本文以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规范没有规定

摘自:http://zhidao.baidu.com/link?url=-p08pEnVSUUPgRgttP2qtv_rPASOci1_Gqqy-vGw6tNSgHzbMU-nZimjlIwn05Vcnq76pCi6gIW2QBDJxIKppyG_wf4PZUNQgHwVB_O3bYm

win7怎么安装和启动 jboss的更多相关文章

  1. win7下安装memcached

    memcached server端服务在win7下的安装.启动图解 1.首先下载解压memcached-1.2.6-win32-bin.zip到某一盘下,如下图 2.通过管理员方式运行cmd.exe. ...

  2. win7下安装MYSQL报错:"MYSQL 服务无法启动"的3534问题

    上午在win7下安装MYSQL,只到“net start mysql”这一步报错:3534的错误: 于是在百度中搜索关键字“mysql服务无法启动3534”. 参考以下两个链接中的方法,解决了3534 ...

  3. Win7上安装Linux双系统

    今天帮同学在Win7上安装Linux,感觉一篇教程很不错,mark一下 原地址:Win7下U盘安装Ubuntu14.04双系统步骤详解 一.前期准备 1.大于2G的U盘一个(我的系统盘制作完成后大约占 ...

  4. Win7下安装Centos7

    win7下安装Centos同一块硬盘时:win启动项没有,使用pe进行修复,之后用easybcd进行centos启动项修复,grub2,自动搜索两块硬盘时:不要动启动项,bios选启动的硬盘即可 li ...

  5. MySQL 安装和启动服务,“本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。”

    MySQL 安装和启动服务,以及遇到的问题 MySQL版本: mysql-5.7.13-winx64.zip (免安装,解压放到程序文件夹即可,比如 C:\Program Files\mysql-5. ...

  6. 以Debug模式启动JBoss

    JBoss服务器的启动方法: 假设JBoss的安装目录为$JBOSS_HOME,Windows以及Linux环境下的Debug模式的启动方法分别为:Windows环境:找到Windows下的JBoss ...

  7. 64位Win7下安装与配置PHP环境【Apache+PHP+MySQL】

    [软件下载] 本安装实例所使用安装文件如图所示: 其中,64位版本的MySQL安装文件mysql-5.5.33-winx64.msi,可直接从官网下载,下载地址:http://dev.mysql.co ...

  8. Ubuntu上安装jdk,Jboss

    Ubuntu上安装jdk 1.使用wget命令或sft方式从oracle官方下载tar.gz格式的jdk1.7,由于ubuntu不支持rpm安装,需要转换,所以不选择rpm格式的jdk 2.使用tar ...

  9. 在Win7中安装程序集到GAC

    原文:在Win7中安装程序集到GAC 微软为提高系统安全,自Vista推出后,在Windows系统中加入了一个新的东东——UAC(User Account Control),这样一个新的技术使得许多操 ...

随机推荐

  1. spring boot 中logback多环境配置

    spring boot 配置logback spring boot自带了log打印功能,使用的是Commons logging 具体可以参考spring boot log 因此,我们只需要在resou ...

  2. python环境配置

    有个chatserver.py文件写的服务器代码,mac下终端执行python  chatserver.py 总是报上面的错,求解 ImportError: No module named twist ...

  3. java反射调用api

    cglib的fastmethod 简单示例: FastClass serviceFastClass = FastClass.create(Person.class); Person p = new P ...

  4. 集成xadmin源码到项目的正式姿势

    xadmin是强大的,但是为了更好的后期定制开发,可能会修改到xadmin的源码. 因此还是推荐将xadmin源码集成到自己的项目中. 1.pip install xadmin 安装xadmin的模块 ...

  5. python简单日志统计

    业务场景:在一个目录里,有许多日志文件,里面是一条条的json数据,格式如下,为防止一个账号被多个ip使用,现在我想知道:哪些用户登录了哪些ip,和哪些ip登录了哪些用户,如果一个ip对应一个用户,就 ...

  6. iOS笔记杂记

    Google Mobile Ads SDK更新至7.2.1不能编译,添加依赖库QuartzCore.framework后正常编译 imageName会把image缓存到手机内存里,不适合大量图片浏览会 ...

  7. Java语言基础-运算符

    一丶逻辑运算符 1.&和&&的区别 (1).两个逻辑运算符的结果是一样的 (2).当第一个表达式为false时,&是会判断后边的表达式,而&&会产生短路 ...

  8. LINUX系统下PXE网络安装虚拟机

    PXE(preboot execute environment),预启动执行环境.由于安装系统的时候,有时候是大批量的安装:这时使用磁盘或虚拟机进行单个安装,效率太差:所以我们开始使用PXE网络安装L ...

  9. 关于PHP页面显示乱码问题的解决

    关于PHP页面显示乱码问题的解决 网页乱码一直是网络编程高手都头痛的问题,我是一个PHP Web编程的初学者,学习当中也遇到了这个问题,查找了相关的资源,总结如下: 一般的中文编码:gb2312,gb ...

  10. 【PL/SQL编程】变量和常量

    1. 变量格式 <变量名><数据类型>[(长度):=<初始值>]; v_countryname varchar2(50):='中国'; 2. 常量格式 <常量 ...