




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Bosent启动逻辑Bosent启动逻辑技术服务部密级 保密 2009年11月文档编号项目名称编撰人陈龙审核人编撰日期2009-11-12审核日期文档修改记录版本号修改日期修改人修改说明1.02009-11-12陈龙新建1. 概述总来说,Bosent启动主要是分下列步骤:a) 装载启动配置文件b) 初使化 (类路径、日志目录、管理服务器、启动装载器、设置关闭勾子)c) 启动所有Bosent启动装载器2. 启动过程122.1 启动入口Framework/start/src下的com.bosent.base.start. Start.javaStart.java的main方法参数及说明:-help, -? - help-install - Run install (create tables/load data)-setup - Run external application server setup-start - Start the server-status - Status of the server-shutdown - Shutdown the server-test - Run the JUnit test scriptno config - Use default configno command - Start the server w/ default config直接运行(默认为-start)或加上-start运行Start.java可以启动bosnet。2.2 装载启动配置文件Start.java会根据输入的启动命令(即-start)到类路径中读取com/bosent/base/start/命令.properties配置文件(即com/bosent/base/start/perties)启动配置文件会装载成一个Strat. Config对象,为bosent 初始化作准备。perties配置文件的主要属性值及含义:# bosent环境根目录,如果为空则默认取虚拟机属性”user.dir”# 即System.getProperty(user.dir);#bosent.home=# 管理服务器配置,用来关闭bosent和查询bosent运行状态#bosent.admin.host=#bosent.admin.port=10523#bosent.admin.key=so3du5kasd5dn# 基础配置目录(bosent.home为前缀)#bosent.base.config=framework/base/config# 基础xml schema目录(bosent.home为前缀)#bosent.base.schema=framework/base/dtd# 基础运行库目录 (bosent.home为前缀)#bosent.base.lib=framework/base/lib# bosent平台基础jar文件 (bosent.home为前缀)#bosent.base.jar=framework/base/build/lib/bosent-base.jar# 默认日志存放目录(bosent.home为前缀)#bosent.log.dir=runtime/logs# bosent容器配置文件路径(bosent.home为前缀)#bosent.container.config=framework/base/config/bosent-containers.xml# 实现StartupLoader接口的启动装载器# 可以配置多个,以”bosent.start.loader+顺序号” 为属性名称# bosent启动时会按顺装载并启动这些装载器bosent.start.loader1=com.bosent.base.container.ContainerLoader# 当虚拟机关闭时,是否使用勾子关闭bosent#bosent.enable.hook=true# 装载完成时关闭bosent#bosent.auto.shutdown=false# 默认Derby数据存放目录(bosent.home为前缀)#derby.system.home=runtime/data/derby# log4j配置文件#log4j.configuration=log4j.xml# 默认区域bosent.locale.default=zh_CN# 默认时区bosent.timeZone.default=GMT+82.3 初始化2.3.1 初始化类路径(ClassPath)l 将bosnet.home下的所有jar及zip装载到ClassPathl 将bosent.base.lib配置的目录及以子目录下的所有jar,zip装载到ClassPathl 将bosent.base.jar配置的jar装载到ClassPathl 将bosent.base.schema配置的目录装载到ClassPathl 将bosent.base.config配置的目录装载到ClassPath注:Bosent先将上述路径及文件装载到com.bosent.base.start .Classpath.java这个对象,最后将这些类路径装载到当前线程的类装载器。2.3.2 初始化日志目录如果bosent.log.dir配置的目录不存在bosent会新建这个目录。2.3.3 初始化Bosent管理服务器Bosent 会根据bosent.admin.host、bosent.admin.port配置的主机及端口新建一个Socket服务器,用来接收“关闭(SHUTDOWN)”、“查询Bosent运行状态(STATUS)”的命令,并作相应处理。注:如果bosent.admin.port配置的为0或负数则Bosent不会启动管理服务器。2.3.4 初始化Bosent启动装载器(StartupLoader)按顺序实例化“bosent.start.loader+顺序号”配置的实现 了com.bosent.base.start .StartupLoader接口的启动装载器,并调用其load方法将其初始化。实际上在Bosent启动时只配置了一个StartupLoader:bosent.start.loader1=com.bosent.base.container.ContainerLoaderContainerLoader的load方法将会读取bosent.container.config配置的容器配置文件,默认为:$bosent.home/framework/base/config/bosent-containers.xmlBosent将会实例化所有bosent-containers.xml中所配置的实现了com.bosent.base.container. Container接口的Bosent容器,并将其初始化。注:Bosent各容器的初始化在第3节具体介绍。2.3.5 设置Bosent关闭勾子(ShutdownHook)bosent.auto.shutdown的配置将决定当虚拟机关闭时,是否使用勾子线程关闭bosent,默认为true2.4 启动所有Bosent启动装载器Bosent将之前(2.3.4节中)初始化的启动装载器一一启动。实际上在Bosent启动时只配置了一个bosent.start.loader:bosent.start.loader1=com.bosent.base.container.ContainerLoaderContainerLoader的start方法实际上是将之前(2.3.4节中)初始化的容器(Container)都一一启动。注:Bosent各容器的启动在第3节具体介绍。3. 关于容器(Containers)33.1 Bosent中的ContainerBosent中的Container都应该实现com.bosent.base.container. Container接口3.2 Container配置文件(xml)配置文件示例: 其中property节点配置的键值,Container可以通过ContainerConfig类来获取,该类提供了一些方便的工具方法。property节点可以嵌套使用: Property节点还有另一种格式: %h %l %u %t %r %s %b %Refereri %User-Agenti3.3 Bosent启动时加载的Container在Bosent启动时com.bosent.base.container.ContainerLoader会加载perties中配置的bosent.container.config属性所配置的 容器配置文件,默认为:$bosent.home/framework/base/config/bosent-containers.xmlbosent-containers.xml文件中配置了多个容器,ContainerLoader会一一实例化这些Bosent容器。这些容器有:l component-container:加载所有Bosent组件;l classloader-container:缓存一个类装载器,其后面的容器可以轻松获取使用;l webslinger-container:TODOl naming-container:装载JNDI服务器l catalina-container:初使化Bosent delegator,装载J2EE 容器,启动Bosent的Web应用l beanshell-container:装载远程BeanShell Telnet Server,可远程执行BeanShell脚本。重点说明一下component-container及catalina-container。3.3.1 component-containercomponent-container作用是加载所有Bosent组件。全类名:com.bosent.base.container. ComponentContainer初始化过程(init方法):component-container在bosent-containers.xml的配置中可以有两个属性:l loader-config:Bosent组件目录配置文件,若不配置则默认为;$bosent.home/framework/base/config/component-load.xmll update-classpath:是否更新java虚拟机属性“java.class.path”的值,默认为true。$bosent.home/framework/base/config/component-load.xml的配置为: 该配置文件指定Bosent组件父目录。Bosent会根据该配置到bosent.home目录下查找相应的目录,并且读取目录下的component-load.xml文件,这个文件与$bosent.home/framework/base/config/component-load.xml的内容是不同的:举例 该配置文件指定了Bosent组件所在的目录。Bosent会根据该配置到“父目录”下查找component-location指定的组件。查找组件下的bosent-component.xml文件。bosent-component.xml配置示例: 该配置文件指定了Bosent组件的名称、要加载到类路径的jar及目录、实体定义、服务定义、单元测试定义、组件下的web应用的。ComponentContainer将会这些信息缓存到ponent. ComponentConfig类中,方便Bosent平台使用。注:实际上component-load.xml文件即可以配置组件父目录(load-components节点)也可以配置组件父目录(load-component节点),即Bosent组件目录可以配置多层,组件父目录中可以有组件也可以有组件父目录,该组件父目录下又可以有组件和组件父目录。当组件父目录下没有component-load.xml文件时,则ComponentContainer将会遍历该父目录下的组有子目录,查找子目录中是否有bosent-component.xml文件,如果有,则表示该子目录为一个Bosent组件,并将其装载。最后跟据update-classpath属性配置决定是否用当前Bosent的ClassPath更新java虚拟机属性“java.class.path” 的值 ,默认为是。(即System.setProperty(java.class.path, classPath.toString()注:ComponentContainer在开始装载Bosent组件时,会将其已装载状态设为true,当重新装载时会抛出AlreadyLoadedException,避免重复装载。启动过程 (start方法):ComponentContainer启动很简单,仅返回true。3.3.2 catalina-containercatalina-container作用是初使化Bosent delegator,装载J2EE容器,启动Bosent Web应用。全类名:com.bosent.catalina.container.CatalinaContainerCatalinaContainer装载J2EE容器及启动Web应用,实际上是调用了Tomcat的类库,其配置与Tomcat的配置也基本相同,这里就不再说明了。主要介绍一下Bosent Delegator是怎样初始化的。 初始化Bosent GenericDelegatorCatalinaContainer在初始化delegator时,读取bosent-containers.xml配置文件中catalina-container节点的属性delegator-name对应的值(默认为default)。调用delegator的getGenericDelegator方法,传入delegator-name的值:GenericDelegator.getGenericDelegator(ContainerConfig.getPropertyValue(cc, delegator-name, default);getGenericDelegator(String delegatorName)方法先从delegator的缓存中读取名为delegatorName的delegator,如果缓存中不存在,则进行同步处理,实例化一个delegator存入缓存中,并将其返回。实例化delegator:a) 装载entityengine.xml配置GenericDelegator的构造方法用EntityConfigUtil这个类中获取配置,EntityConfigUtil中有一个static块中读取并装载了:$bosent.home/ framework/entity/config/ entityengine.xmlb) 读取实体定义ModelReader.getModelReader(delegatorName)ModelReader根据entityengine.xml中delegoter的配置: 取得entity-model-reader的值,从缓存中取出该值名称的ModelReader,如果不存在,则进行同步处理,实例化一个新的ModelReader,存入缓存。在ModelReader的构造方法中会读取entityengine.xml中name属性的值与entity-model-reader的值同的entity-model-reader节点:entity-model-reader节点可以定义子节点,子节点的定义与bosent-component.xml中实体定义相同。ModelReader读取这些子节点实例化为MainResourceHandler,并存入entityResourceHandlers集合中。然后ModelReader读取ComponentConfig中装载的所有组件的实体定义,并将其实例化为ComponentResourceHandler,存入entityResourceHandlers集合中。ModelReader实例化完成后就调用其getEntityCache方法,该方法的作用是将entityResourceHandlers集合中所有的实体定义全部实例化为ModelEntity对像,缓存在ModelReader.entityCache中,后然为实体建立主外键关系。最后统计出 实体数、视图实体数、字段数、实体依赖关系数、实体自动依赖关系数。这些都做为ModelReader的属性存起来了,方便以后使用。c) 读取实体组定义ModelGroupReaderModelGroupReader根据entityengine.xml中delegoter的配置: 取得entity-group-reader的值,从缓存中取出该值名称的ModelGroupReader,如果不存在,则进行同步处理,实例化一个新的ModelGroupReader,存入缓存。在ModelGroupReader的构造方法中会读取entityengine.xml中name属性的值与entity-group-reader的值同的entity-group-reader节点:entity-group-reader节点可以定义子节点,子节点的定义与bosent-component.xml中实体组定义相同。ModelGroupReader读取这些子节点实例化为MainResourceHandler,并存入entityGroupResourceHandlers集合中。然后ModelGroupReader读取ComponentConfig中装载的所有组件的实体组定义,并将其实例化为ComponentResourceHandler,存入entityGroupResourceHandlers集合中。ModelGroupReader的构造方法最后会调用其getGroupCache方法,该方法的作用是将entityGroupResourceHandlers集合中所有的实体组定义全部装载ModelGroupReader.groupCache中。关于实体组ModelGroup:entityengine.xml中delegoter的配置: 实体组的配置:实体组配置entity-group节点中的group值是要与delegator节点中group-map节点的group-name属性值对应上。这就决定了这个组的实体的定义及数据将会存在datasource-name指定数据库中。注:delegator中有一个默认的实体组(com.bosent),Bosent中决大部份的实都没有定义组,那这些组都属于这个默认的组。d) 新建实体缓存Cache当使用delegator查询实体数据时,可以从缓存中读取提高效率。e) 检查实体定义GenericDelegator的构造方法会对之前ModelReader装载的实体定义进行检查,检查内容如下:GroupNotFound实体所在实体组不存在HelperNotFound实体组对应的数据源定义不存在TableNameGT30实体表名超过30个字符TableNameRW表名使用了Bosent保留字FieldNotUnique实体中有重名的字段名FieldNameGT30实体字段名超过30个字符FieldNameEQ0实体字段名长度为0FieldNameRW字段名使用了Bosent保留字FieldTypeNotFound字段类类型在FieldType中不存在FieldType在下面介绍IndexDuplicateName索引重名IndexTableDupName索引名称与表名重名IndexFKDupName索引名称与某个表的主键名重名IndexNameGT18索引名超进15个字符RelatedEntityNotFound某实体依赖的实体不存在RelationNameNotUnique实体重复依赖某实体RelationFkDuplicate实体依赖使用了重名外键名称RelationFkTableDup实体依赖外键与某表名重名RelationFkIndexDup实体依赖外键与某索引名重名RelFKNameGT18外键名称超过18个字符RelatedOneKeyMapsWrongSize一对一关系中,实体主键数目与keyMap中定义的键数不一致RelationOneRelatedPrimaryKeyMissing一对一关系中,实体主键在KeyMap定义中不存在RelationRelatedFieldNotFoundKeyMap定义的实体依赖作用字段在本实体中不存在RelationFieldNotFoundKeyMap定义的实体依赖作用字段在依赖的实体中不存在RelationFieldTypesDifferent两实体依赖关系作用字段类型不一致FieldType是Bosent中java数据类型与数据库数据类型映射的关系定义,不同的数据库不同,以xml配置文件配置,在entityengine.xml中配置有这些配置件的读取与文件名:其中name属性为fieldType名称,entityengine.xml中定义datasource是会用到。loader属性指定了读取location属性中的fieldType文件时使用的装载器,装载器的定义也在entityengine.xml中:Bosent实体定义的保留字:f) 初始化GenericHelperGenericHelper由GenericHelperFactory初始化,GenericHelperFactory通过EntityConfigUtil读取数据源配置信息,EntityConfigUtil装载数据源配置由一个static块读取delegator中所有的实体组(group-map),找到实体组中对应的datasource名称,按这个datasource名称去entityengine.xml中查找名称为datasource名称的datasource节点: !- -GenericHelperFactory根据这个配置初始化一个GenericHelper,存在GenericHelperFactory缓存中。datasource节点相关属性的含义:helper-classGenericHelper实现类schema-nameSchema名称,当Bosent初始化表时,会建立一个名为schema-name的Schame,表都会建立在这个Schame下。field-type-name实体java类型与数据库数据类型映射关系配置check-on-start当Bosent启动时是否检查实体定义与数据库表是否一致。add-missing-on-start检查实体定义与数据库表不一致时,是否在数据库中建立这些定义。(如:实体定义的表不存在时建立表、实体定义的字段不存在时在表中建立列)join-styleSQL中Joi语句的风格:ANSI 风格:select * from a join b on a.id = b.id老的风格:select * from a, b where a.id = b.idANSI风格性能要比老的风格高。read-data节点决定 intall装载数据时读取reader-name为该节点对应的reader-name的实体数据定义。read-data节点可以定义多个。jndi-jdbc节点是使用jndi获取数据源时的配置。其中jndi-server-name属性为jndi服务器配置名称,jndi服务器配置在framework/base/config目录下的jndiservices.xml及perties。jndi-name属性为jndi服务器上配置的datasource名称。isolation-level属性为事务隔离级别。其它配置其它配置不具体说明了,可以参见到Bosent源码中:com.bosent.entity.config. DatasourceInfo类的属性g) 检查数据库检查数据库是选择性的,取决于entityengine.xml中datasource节点的check-on-start属性,当属性值为true时(默认为true)则进行数据库存检查,检查数据库有以下内容:l 数据库信息l 实体定义与表定义是否一致,当不一致时跟据add-missing-on-start属性来决定是否要在库表中建立这些库表中不存在的实体定义(如:实体定义的表不存在时建立表、实体定义的字段不存在时在表中建立列)一致性检查还包括主键约束、外键约束等,具体可以参考上一小节中“datasource节点相关属性的含义”h) 初始化加密类实例化一个com.bosent.entity.util.EntityCrypto对象。i) 初始化集群缓存清理服务初始化集群缓存清理服务是选择性的,在entityengine.xml的delegator配置中有一个distributed-cache-clear-enabled属性,当这个属性为true时(默认为false),将会实例化一个集群缓存清理服务类,该类名由distributed-cache-clear-class-name的值确定,Bosent中默认为“com.bosent.entityext.cache.EntityCacheServices”。j) 初始化实体ECA处理器(EntityEcaHandler)初始化实体ECA处理器是选择性的,但是在Bosent启动时是必须的,在install装载数据时是非必须的。在entityengine.xml的delegator配置中有一个entity-eca-enabled属性,当属性值为true时(默认为true),则进行实体ECA处理器的初始化。实体ECA处理器初始化过程:GenericDelegator会读取ntityengine.xml文件中delegator节点配置entity-eca-handler-class-name属性指定的EntityEcaHandler的实现类名(当不配置时,Bosent默认为:“com.bosent.entityext.eca.DelegatorEcaHandler”),将其实例化。然后调用setDelegator进行初始化。初始化DelegatorEcaHandler:l 初使化一个名为“entity-$delegator.getDelegatorName()”GenericDispatcher,并从GenericDispatcher中获得DispatchContext,初始化Dispatcher在节中介绍。l 读取实体ECA配置DelegatorEcaHandler根据entityengine.xml中delegoter的配置: 取得entity-eca-reader的值,从缓存中取出该值名称的ecaCache(类型为MapString, List),如果不存在,则进行同步处理,实例化一个新的ecaCache,存入缓存。DelegatorEcaHandler会读取entityengine.xml中name属性的值与entity-eca-reader的值同的entity-eca-reader节点:entity-eca-reader节点可以定义子节点,子节点的定义与bosent-component.xml中实体eca定义相同。DelegatorEcaHandler读取这些子节点实例化为MainResourceHandler,并装载到ecaCache中。然后DelegatorEcaHandler读取ComponentConfig中装载的所有实体ECA定义,并将其实例化为ComponentResourceHandler,装载到ecaCache中。 初始化Bosent GenericDispatcher初始化GenericDispatcher是通过GenericDispatcher. getLocalDispatcher方法。在初始化GenericDispatcher时,需要传入Dispatcher的名称,如果传入为Null,则取名为“default”。GenericDispatcher先从缓存中按传入Dispatcher的名称取得GenericDispatcher实例,如果不存在,实例化一个GenericDispatcher,存入缓存。a) 初始化ServiceDispatcher实例化GenericDispatcher需要一个ServiceDispatcher的实例,如果在getLocalDispatcher入参没有传入ServiceDispatcher则会通过ServiceDispatcher.getInstance获得一个实例。ServiceDispatcher实例名称为“default”,getInstance方法会从缓存中跟据这个名称获取ServiceDispatcher实例,如果不存在则会实例化一个新的ServiceDispatcher存入缓存。ServiceDispatcher初始过程: 装载serviceengine.xml配置ServiceDispatcher的构造方法用EntityConfigUtil这个类中获取配置,EntityConfigUtil中有一个static块中读取并装载了:$bosent.home/ framework/service/config/ serviceengine.xml 读取服务组定义ServiceGroupReader.readConfig()ServiceGroupReader读取serviceengine.xml配置中service-groups节点下的子节点,子节点的定义与bosent-component.xml中服务组定义相同。ServiceGrou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 905平安附加守护一生终身医疗保险合同5篇
- 别墅栏杆合同2篇
- 数学培优竞赛试题及答案
- 档案应用竞赛试题及答案
- 家庭日常居住房屋承租合同7篇
- 保鲜技术试题及答案
- 2025年广东小高考试题及答案
- 河南周口地区洪山乡联合学校2026届九上化学期中达标检测模拟试题含解析
- 海员基本安全培训换证课件
- 海员培训安全意识课件
- 医院医保新员工岗前培训
- 静脉治疗护理技术操作标准解读
- 突发公共卫生事件校长为第一责任人制度
- 北师大版高中英语让学生自由飞翔
- (2024)新课标一年级语文上册 我上学了 第2课时 我爱我们的祖国 课件
- 手工木工(木模板工)技能考核要素细目表
- 《跨境直播运营》课件-跨境电商交易平台直播
- 液化气店转让合同范本
- 保温材料 扩散法测定长期吸水率
- 生活垃圾填埋场地下水污染防控与综合治理工程项目可行性研究报告
- 四川公路工程竣工文件资料编制实施细则
评论
0/150
提交评论