SlideShare a Scribd company logo
1 of 64
Download to read offline
企业级软件的组件化和动态化开发实践

         池建强--@sagacity
         用友集团-瑞友科技-IT应用研究院
         www.ufida.com
         www.rayootech.com




11年4月2日星期六
大纲
       ‣     软件开发之殇
       ‣     组件化与动态化
       ‣     基于WTP Facet、XDoclet、ANT的组件构建
       ‣     OSGi——兄弟,全靠你了
       ‣     展望:所有的Java应用都是Bundle




11年4月2日星期六
现代人类文明运行于软件之上,
             而软件的构建过程却隐于黑暗里,多
             少青春的日子耗费在了软件的缺陷上




11年4月2日星期六
从软件系统诞生
             之初,程序员们就
             开始梦想有一天能
             够像建造桥梁和房
             屋那样“透明”的构
             造软件,实现“即插
             即用”的软件系统



11年4月2日星期六
但是到目前为
             止,软件的开发依
             然让我们倍感挫
             折,失败的软件项
             目有增无减,我们
             还在路上




11年4月2日星期六
但是到目前为
             止,软件的开发依
             然让我们倍感挫
             折,失败的软件项
             目有增无减,我们
             还在路上




11年4月2日星期六
组件化的技术让我们更加接近真理之门




11年4月2日星期六
组件化的技术让我们更加接近真理之门




             OSGi?



11年4月2日星期六
组件化与动态化
       ‣     组件化           ‣   动态化
       ‣     完整的业务逻辑单元     ‣   动态的改变组件的状态
       ‣     解决某一方面的问题     ‣   动态的改变数据和数据结构
       ‣     每个组件可以独立开发    ‣   动态的修改业务流程
       ‣     实现组织级复用       ‣   动态的调整业务规则
       ‣     按需分配          ‣   动态的分配资源
       ‣     动态的安装启动停止卸载   ‣   动态的计算



11年4月2日星期六
Metadata
       组件化与动态化
                                                 Workflow
       ‣     组件化                ‣   动态化          RuleEngine
       ‣     完整的业务逻辑单元          ‣   动态的改变组件的状态
       ‣     解决某一方面的问题          ‣   动态的改变数据和数据结构
       ‣     每个组件可以独立开发         ‣   动态的修改业务流程
       ‣     实现组织级复用            ‣   动态的调整业务规则
       ‣     按需分配               ‣   动态的分配资源
       ‣     动态的安装启动停止卸载        ‣   动态的计算

                          Component Building
11年4月2日星期六
企业级软件开发遇到的挑战
       ‣     组织级复用
       ‣     不是复制粘贴,不是简单的代码、接口或算法的复用
       ‣     没人愿意编写重复代码
       ‣     复用是永远的痛——200个表的故事

       ‣     组件的管理
       ‣     组件的独立开发
       ‣     组件的依赖关系
       ‣     自动构建——机器的活得让机器干




11年4月2日星期六
我们遇到的...
                                                    电子商务平台
                                      ERP业务平台


                   Flex                                 银企直联平台

                                 报表
                      AJAX
                                        组
                                        织
             规则引擎            任务调度                   数     接
                                        权       工
                                                    据     口
                                        限       作
                                                    字     服
                    业务日志                        流
                                                    典     务
                                                引
                                                          管
                                                擎
              消息          全文检索                            理




                              Main FrameWork

11年4月2日星期六
我们遇到的...
                                                    电子商务平台
                                      ERP业务平台


                   Flex                                 银企直联平台

                                 报表
                      AJAX
                                        组
                                        织
             规则引擎            任务调度                   数     接
                                        权       工
                                                    据     口
                                        限       作
                                                    字     服
                    业务日志                        流
                                                    典     务
                                                引
                                                          管
                                                擎
              消息          全文检索                            理




                              Main FrameWork

11年4月2日星期六
我们遇到的...
                                                    电子商务平台
                                      ERP业务平台
 Here you are!
                   Flex                                 银企直联平台

                                 报表
                      AJAX
                                        组
                                        织
             规则引擎            任务调度                   数     接
                                        权       工
                                                    据     口
                                        限       作
                                                    字     服
                    业务日志                        流
                                                    典     务
                                                引
                                                          管
                                                擎
              消息          全文检索                            理




                              Main FrameWork

11年4月2日星期六
我们希望的...
              Flex   AJAX               电子商务平台

              消息      监控
                                  银企直联平台     ERP业务平台

              预警      短信
                                                   接
              报表     规则引擎         组     工    数     口
                                  织     作    据     服
                                  权     流    字     务
             业务日志    任务调度               引
                                  限          典     管
                                        擎          理
              消息     全文检索

                                                       GAP-API



                            Main FrameWork
11年4月2日星期六
开发实践
       ‣     Eclipse WTP Facets
       ‣     XDoclet
       ‣     Ant
       ‣     为什么当时没有采用OSGi
       ‣      资源文件的处理
       ‣      Servlet容器的支持
       ‣      持久化、事务




11年4月2日星期六
Eclipse WTP Facets
       ‣     提供了优秀的扩展机制
       ‣     对WTP(Web Tools Platform)平台进行扩展
       ‣     创建WTP项目时增加自定义的组件
       ‣     提供组件的依赖关系和多版本管理
       ‣     Facets允许开发人员以组件集成的方式来创建项目,像搭积木一
             样把各种组件进行组合并完成最终构建,是面向组件开发的一
             种实现机制
       ‣     Facets不提供运行时组件生命周期的管理



11年4月2日星期六
核心的WTP Faceted包括以下内容:

               id            versions             requires      conflicts

             jst.java     1.3, 1.4, 1.5, 1.6                      jst.ear

             jst.web        2.2, 2.3, 2.4          jst.java   jst.ear, jst.ejb

             jst.ear    1.2, 1.3, 1.4, 5.0, 6.0                   jst.java

             jst.ejb    1.1, 2.0, 2.1, 3.0, 3.1    jst.java   jst.ear, jst.java




11年4月2日星期六
核心的WTP Faceted包括以下内容:

               id            versions             requires      conflicts

             jst.java     1.3, 1.4, 1.5, 1.6                      jst.ear

             jst.web        2.2, 2.3, 2.4          jst.java   jst.ear, jst.ejb

             jst.ear    1.2, 1.3, 1.4, 5.0, 6.0                   jst.java

             jst.ejb    1.1, 2.0, 2.1, 3.0, 3.1    jst.java   jst.ear, jst.java




11年4月2日星期六
创建一个标准的Dynamic Web Project




11年4月2日星期六
创建一个标准的Dynamic Web Project


         Facets




11年4月2日星期六
XDoclet & Ant
       ‣     XDoclet:优秀的文本处理和构建工具
       ‣            资源文件处理、Merge Point
       ‣     Ant:   历史悠久的构建脚本工具
       ‣            独立组件构建
       ‣            整体构建
       ‣            Facets   Ant   XDoclet




11年4月2日星期六
组件化开发实践
       ‣     各组件独立开发,独立构建(build.xml)
       ‣     公共资源文件处理-MergePoint(i18n,oid,spring,include)
       ‣     整体构建(TotalBuild)
       ‣     基于Facet机制装配组件




11年4月2日星期六
实际效果




11年4月2日星期六
实际效果


              TotalBuild




11年4月2日星期六
实际效果


              TotalBuild




11年4月2日星期六
实际效果


              TotalBuild
                           Facets




11年4月2日星期六
开始实践之旅
       ‣     各组件独立研发,依赖框架,依赖接口
       ‣     编写自己的build.xml,实现clean compile jar distribution



                                                        db
                                                        merge
                                                        resource
       ‣     在组件项目的根目录下执行ant                            src
                                                        webModule
       ‣     构建出统一目录结构的Distribution


11年4月2日星期六
公共资源文件处理(Merge)
       ‣     建立公共模板文件,文件后缀设置为xdt
       ‣      applicationContext.xdt------------spring
       ‣      global.xdt---------------------------include global.jsp
       ‣      web.xdt-----------------------------web.xml
       ‣      ......



       ‣     设置Merge Point

              <XDtMerge:merge file="workflow-hbm.data"></XDtMerge:merge>




11年4月2日星期六
Merge文件的内容
             <value>gap/wf/persistent/db/bo/GapwfProcessinstance.hbm.xml</value>
             <value>gap/wf/persistent/db/bo/GapwfActivityinstance.hbm.xml</value>
             <value>gap/wf/persistent/db/bo/GapwfActivityinstancepre.hbm.xml</value>
             <value>gap/wf/persistent/db/bo/GapwfRevelantdata.hbm.xml</value>
             <value>gap/wf/persistent/db/bo/GapwfWorkitem.hbm.xml</value>
             <value>gap/wf/persistent/db/bo/GapwfWorkitemdata.hbm.xml</value>
             <value>gap/wf/persistent/db/bo/GapwfDynprocessrelation.hbm.xml</value>



                                                                               db
                                                                               merge
                                                                               resource
                                                                               src
                                                                               webModule

11年4月2日星期六
XDoclet构建                                                                     <path id="xdoclet.classpath">
                                                                                       <fileset dir="${lib.dir}">
                                                                                          <include name="*.jar"/>
       ‣     设置XDoclet的classpath                                                       </fileset>
                                                                                       <pathelement location="classes"/>
       ‣     设置Ant的taskdef                                                           </path>

       ‣     定义target
                                                           <taskdef name="xdoclet" classname="xdoclet.DocletTask"
                                                             classpathref="xdoclet.classpath" />



                        <target name="gen-applicationContext.xml">
                           <xdoclet destdir="${webmodule.dir}/WEB-INF/conf/applicationContext" force='true' mergedir="${merge.dir}">
                             <fileset dir="${source.dir}" includes="**/*.java" />
                             <template templateFile="template/applicationContext.xdt" destinationfile="applicationContext.xml" />
                           </xdoclet>
                        </target>




11年4月2日星期六
TotalBuild
       ‣     构建Facets项目所需要的组件内容
                <!--调用各个组件的build.xml-->
                <target name="build">
                   <ant dir="${gap-api}" antfile="build.xml" target="all" />
                   <ant dir="${venus-frame}" antfile="build.xml" target="all" />
                   <ant dir="${venus-page}" antfile="build.xml" target="all" />
                   <ant dir="${venus-log}" antfile="build.xml" target="all" />
                   ......
                </target>
                <!--重命名-->
                <target name="plugin">
                   <available file="Templates" type="dir" property="Templates.present" />
                   <antcall target="clean" />
                   <move todir="Templates/0. 主程序框架">
                        <fileset dir="${gap-api}/dist" />
                        <fileset dir="${venus-frame}/dist" />
                   </move>
                   ......
                </target>




11年4月2日星期六
构建我们自己的Facet
       ‣     创建基于org.eclipse.ui.newWizards的扩展点
       ‣     设置category和wizard,实现独立的项目向导




11年4月2日星期六
核心扩展点
       ‣     org.eclipse.wst.common.project.facet.core.facets
       ‣      <category />——Facet的类别
       ‣      <project-facet />——Facet的属性描述
       ‣      <project-facet-version />——Facet的版本处理
       ‣      <template />——设置必选的Facet
       ‣      <preset />——预置Facet集合


        辅助扩展点——增加图标和向导页面
       ‣     org.eclipse.wst.common.project.facet.ui.images
       ‣     org.eclipse.wst.common.project.facet.ui.wizard


11年4月2日星期六
Facet的核心配置
             <!--Facet的基础信息配置-->
             <project-facet id="gap.mainframe">
                <label>0. 主程序框架</label>
                 <description>GAP平台的基础框架</description>
                 <category>gap.category</category>
             </project-facet>

             <!--设置Facet的某个版本的相关信息(安装代理类,约束等)-->
             <project-facet-version facet="gap.mainframe" version="3.7">
                <action id="gap.mainframe.install" type="INSTALL">
                   <delegate class="venus.tools.ide.facet.GAPFacetInstallDelegate"/>
                </action>
                <constraint>
                   <requires facet="jst.web" version="[2.4"/>
                </constraint>
             </project-facet-version>



11年4月2日星期六
Facet的两个代理类
       ‣     实现接口:org.eclipse.wst.common.project.facet.core.IDelegate
       ‣     GAPFacetInstallDelegate:负责负责所有实体Facet的安装
       ‣     BuildFacetsDelegate:
       ‣      虚拟Facet,在所有实体Facet安装完成后调用
       ‣      负责Facet的装配策略
       ‣      创建配置文件、驱动XDoclet进行文件合并、设置classpath
       ‣      创建project的nature(.tomcatplugin)
       ‣      删除不需要的文件




11年4月2日星期六
解决了哪些问题
       ‣     组件的独立开发
       ‣     组件的组合与依赖关系
       ‣     组件版本管理
       ‣     按需分配
       ‣     最终实现了组织级别的复用




11年4月2日星期六
遗留问题
       ‣     能装不能拆,无法实现物理隔离
       ‣     独立jar包的版本冲突
       ‣     运行时动态的生命周期管理(Install、Update、Remove)
       ‣     Time For:




11年4月2日星期六
遗留问题
       ‣     能装不能拆,无法实现物理隔离
       ‣     独立jar包的版本冲突
       ‣
                             Time For:
             运行时动态的生命周期管理(Install、Update、Remove)
       ‣     Time For:




                         O           Gi
11年4月2日星期六
OSGi
       ‣     天将降大任
       ‣     2005,R4.0发布——最好的年代,也是最坏的年代
       ‣     2010年3月,OSGi企业级规范4.2正式发布
       ‣     世界是你的,也是我的,归根结底应该是由Bundle构建的
       ‣     完美的解决方案




11年4月2日星期六
update
                     install           refresh



                    INSTALLED                            STARTING

               resolve              update
                                                 start
                                    refresh


                    RESOLVED                              ACTIVE    stop

             uninstall         uninstall                     stop


                  UNINSTALLED                            STOPPING


11年4月2日星期六
OSGi 企业级特性
       ‣     声明式服务(Declarative Services)
       ‣     框架加载(Framework Launching)
       ‣     Blueprint服务(Blueprint Service)
       ‣     Web应用(Web Application Bundle)
       ‣     远程服务 日志服务 JPA JTA JDBC......




11年4月2日星期六
OSGi 企业级特性
       ‣     声明式服务(Declarative Services)
       ‣     框架加载(Framework Launching)
       ‣     Blueprint服务(Blueprint Service)
       ‣     Web应用(Web Application Bundle)
       ‣     远程服务 日志服务 JPA JTA JDBC......




11年4月2日星期六
声明式服务
       ‣     Service Component Model
       ‣     通过声明的方式实现OSGi服务的发布、查找和绑定
       ‣     通过xml的方式定义Component和Service
       ‣     引用服务和提供服务都以接口的方式定义
       ‣     允许以纯Java POJO的方式开发组件,不依赖OSGi框架
       ‣     更容易测试和模拟




11年4月2日星期六
声明式服务——提供服务和消费服务
       ‣     在Bundle的Manifest中定义一个或多个组件文件
             Bundle-ManifestVersion: 2
             ...
             Service-Component: OSGI-INF/component.xml [, ...]*

       ‣     在OSGI-INF/目录下编写组件文件
             <?xml version="1.0" encoding="UTF-8"?>
             <scr:component name="bookstore-order" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
             	

   <!--该组件的实现类-->
             	

   <implementation class="com.osgi.ds.OrderService"/>
             	

   <!--提供的服务-->
             	

   <service><provide interface="com.osgi.ds.IOrder"/></service>
             	

   <!--消费的服务-->
             	

 <reference interface="com.osgi.ds.ICart" bind="setCart" unbind="unsetCart"
             	

 	

 policy="dynamic" cardinality="1..1"/>
             </scr:component>

11年4月2日星期六
声明式服务——组件的生命周期
       ‣     Enabled——组件的启动
       ‣     Satisfied——满足组件的配置信息
       ‣     Immediate Component——立即激活组件
       ‣     Delayed Component——延迟加载组件
       ‣     Factory Component——工厂组件




11年4月2日星期六
<=>%42.*%0$1-.*$0%*+$%#(45("$"*%#(")-120&*-("%&.%&%.$09-#$%-"%*+$%.$09-#$%0$1-.*0'%&
                                                                                 *+$%#(45("$"*%#(")-120&*-("7%?+$%.$09-#$%50(5$0*-$.%)(0%*+-.%0$1-.*0&*-("%#(".-.*%()
                                                                                 50(5$0*-$.%&.%/$)-"$/%-"%+),-&.)/0,12),%&)#%("%5&1$ @AB7
                                                                                 ?+$%.*&*$%/-&10&4%-.%.+(:"%-"%C-120$%@@D7D7%

       声明式服务——组件的生命周期                                          3&4!,)/55676      899)*&$%)/:1921")"%/:1"(&4!,$%&1"
                                                                                                                                    )(+=,*>+,(
                                                                                                     6789:&8;&<3
       ‣     Enabled——组件的启动                                                                                   B&)/0&2
                                                                                                              2,-$2.$&C                       B&)/0&2

             Satisfied——满足组件的配置信息
                                                                                                                                              D62,-$2.$&C
       ‣                                                                                           +=,*>+,(                                         $.%CA6,0$)E
                                                                                                                                     9.:&?<
                                                !"#$"%&%'()*+&(!,-.&(                                                      /&-.010'*2&(3&12*-&4(3$&-*+*-0'*"%(5&
                                                                                                                                                    '&B$6C$69
       ‣     Immediate Component——立即激活组件
                                    !"#$%&#'&()*+&#(&,*'$&(&-#./#0#+12314&4$#+14"*,5(0$*14#.&+12&'#545'&-#.&+05'&#$%&(&#0(&#4
                                                                   .54-6&'#5'*4,#*$7#$%&4#89:#'%156-#-&0+$*)0$&#$%0$#+12314&4$#+14"*,5(0$*14;#<%*'#0661='#89
                                                               !!"#$#2         3(4+5()-./'0/1(1,-
       ‣     Delayed Component——延迟加载组件
                                   2&4$0$*14'#$1#&0,&(6/#(&+60*2#0+$*)0$&-#+12314&4$#+14"*,5(0$*14';
                                               8%E$'%&**0-62*$%()%&%/$,&'$/%#(45("$"*%-.%*+$%/$,&'-"1%()%#,&..%,(&/-"1%&"/%(6F$#*%#0$
                                                !"#$%&'(()*+                  *+$%&#*-9&*-("%()%&%/$,&'$/%#(45("$"*%#(")-120&*-("%/($.%"(*%(##20%2"*-,%*+$0$%-.%&
                                                                   ,&-./&0'123425&56'1257"#$%.6"25
       ‣     Factory Component——工厂组件                                             )(0%&%.$09-#$%(6F$#*7%8%#(45("$"*%-.%&%/$,&'$/%#(45("$"*%:+$"%-*%.5$#-)-$.%&%.$09-#$
                                                                                 *(0'%#(45("$"*%&"/%/($.%"(*%+&9$%*+$%!""#$!%&#%&**0-62*$%()%*+$%'(")(*#*&%$,$4
                                                                                                                         <1&'(:;&(1
                                                                                        2345674%789
                                                                                 <=>%42.*%0$1-.*$0%&%.$09-#$%&)*$0%*+$%#(45("$"*%#(")-120&*-("%6$#(4$.%.&*-.)-$/7%?
                                                                                 *+-.%.$09-#$%42.*%,((E%*(%(6.$09$0.%()%*+$%.$09-#$%0$1-.*0'%&.%-)%*+$%#(45("$"*I.%62"
                                                                                B&-"#&4               B&-"#&4
                                                                                 *$0$/%*+-.%.$09-#$7%?+-.%.*0&*$1'%4&E$.%-*%5(..-6,$%*(%0$1-.*$0%.$09-#$.%:-*+(2*%#0$&*-"
                                                                                D%40'*4+*&C           40'*4+*&C
                                                                                 )(0%*+$%62"/,$%&"/%,(&/-"1%#,&..$.3%*+$0$6'%&,,(:-"1%0$/2#*-("%-"%-"-*-&,-J&*-("%*-4$
                                                                                 4$4(0'%)((*50-"*7
                                                                                          >8?7468>89                  D%9&'           B&-"#&4
                                                                                                                        4&12*-&     D%40'*4+*&C
                                                                                 K+$"%<=>%0$1-.*$0.%*+$%.$09-#$%("%6$+&,)%()%&%#(45("$"*%#(")-120&*-("3%-*%42.*%&9(
                                                                                                 6
                                                                                                   9&'
                                                                              4&12*-&+0-'"1,E(F77%
                                                                                 ,(&/%*(%(##20%)0(4%*+$%#(45("$"*L.%62"/,$7%<=>%#&"%$".20$%*+-.%6'%0$1-.*$0-"1%&%-#
                                                                                                   4&12*-&
                                                                              "'G&1H*4&E(6
                                                                                 (6F$#*%:-*+%*+$%C0&4$:(0E%)(0%*+&*%.$09-#$7%M'%0$1-.*$0-"1%&%-#+.!'#/%'&(+0%(6F$#*3%*
                                                                                         &'(:;&(1
                                                                                 (6F$#*%-.%"(*%"$$/$/%2"*-,%*+$%-#+.!'#/%'&(+0%-.%#&,,$/%*(%50(9-/$%*+$%.$09-#$%(6F$#*7%
                                                                                                                                                 *+(C,%0#*-E
                                                                                                                              5-67=8
                                                                                                                                                 1&B*%C*%9
                                                                                 $0*-$.%)(0%*+-.%0$1-.*0&*-("%#(".-.*%()%*+$%#(45("$"*%50(5$0*-$.%&.%/$)-"$/%-"%+),-&.)/
                                                                                 @AB7
                                                                                 ?+$%&#*-9&*-("%()%&%#(45("$"*%#(")-120&*-("%42.*%6$%/$,&'$/%2"*-,%-*.%.$09-#$%-.%0$G
11年4月2日星期六
框架加载
       ‣     R4.2提供了一套标准的API用来启动OSGi容器
       ‣     各OSGi框架都需要实现——org.osgi.framework.launch.FrameworkFactory
       ‣     允许在容器外启停OSGi框架,例如在web容器中通过listener启动OSGi
       ‣     示例代码如下:

             Class<FrameworkFactory> factoryClass = ServiceLoader.load(FrameworkFactory.class);
             FrameworkFactory factory = factoryClass.newInstance();
             Map<Object, Object> conf;
             ......//初始化配置信息
             Framework framework=factory.newFramework(conf);
             framework.init();
             BundleContext bundleContext = framework.getBundleContext();
             ......//安装bundle
             framework.start();




11年4月2日星期六
BluePrint服务
       ‣     BluePrint的基础——Spring Dynamic Modules-->Eclipse Gemini
       ‣     为OSGi定义了依赖注入(dependency injection)框架
       ‣     处理OSGi服务的动态性
       ‣     与POJO协同工作
       ‣     OSGI-INF/blueprint/
             <?xml version="1.0" encoding="UTF-8"?>
             <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
                 ...
             </blueprint>




11年4月2日星期六
3&45"$,67689       :$0;,(%"5)%5"$
                                                                                     5&'(
       BluePrint服务——Bean管理器
                                                                                            9
       ‣     创建具有给定参数和属性的 Java 对象的实例
       ‣     管理对象的生命周期
                                                                          ',+7/&(1               0,.0&,18
       ‣     argument, property, scope
       ‣     构建方式:className, factoryMethod, factoryComponent
                          !"!#$#"            45&'(6
                                             !"#$G#%&2&%&$3.'$&$7#&-$/&-&(#'$+,$'#*'#,#-%#2$+-$%"#$$/&.#0&'.1.'.$+-%#'3&
             <bean id="order" class="com.osgi.bs.OrderService" init-method="init"
               destroy-method="destroy">     2(3)(#&#'0&'.1.'.<$!&70# CBC<C$.-$*&(# BCI$*'.5+2#,$&-$.5#'5+#9$.3$%"#$'#
               <argument value="1"/>
               <argument value="2"/>
                                             &-2$%"#$/&.#0&'.1.'.$+-%#'3&6#<$!"#$%&70#$.-0)$*'.5+2#,$&$,1//&')4$%"#$,./
                                             %+.-,$7#%9##-$%"#$2+33#'#-%$3#&%1'#,$&'#$2+,61,,#2$+-$0&%#'$,#6%+.-,<
               <property name="Description" value="This is the order"/>
             </bean>                         <01/$,67686        :$0;,=0;04$",3$0%5"$'
                                             :11,;571&).,)<=&/&(1 >8(1'?         %&'()*&1'@'1'              A&BC,;01;.(

                                             "1                    45            "16                        !"#$+2$.3$&$%.*$0
11年4月2日星期六
                                                                                 768'*"#$                   7#$1-+;1#$+-$%"
BluePrint服务——服务注册
             <!--服务注册-->
             <service id="orderService" interface="com.osgi.bs.IOrderService" ref="order">
             	   <service-properties>
             	   	   <entry key="order.discount" value="0.8"/>
             	   </service-properties>
             </service>




               <!--实际代码-->
               OrderService os = new OrderService(1, 2);
               os.setDescription( "This is the order" );
               Hashtable props = new Hashtable();
               props.put("order.discount", "0.8");
               bundleContext.registerService(com.osgi.bs.OrderService.class.getName(), os,
               props);




11年4月2日星期六
BluePrint服务——服务引用
             <!--reference方式-->
             <reference id="orderRef" interface="com.osgi.bs.IOrderService" timeout="1000"
             availability="optional"/>
             <bean id="orderClient" class="...">
             	   <property name="order" ref="orderRef"/>
             </bean>




             <!--reference-list方式-->
             <reference-list id="orderRefs" interface="com.osgi.bs.IOrderService"
             availability="optional">
             	   <reference-listener bind-method="bind" unbind-method="unbind">
             	   	   <bean class="com.osgi.bs.ReferenceListener"/>
             	   </reference-listener>
             </reference-list>




11年4月2日星期六
BluePrint服务——服务引用
             <!--reference方式-->
             <reference id="orderRef" interface="com.osgi.bs.IOrderService" timeout="1000"
             availability="optional"/>
             <bean id="orderClient" class="...">
             	   <property name="order" ref="orderRef"/>                 List中的对象是动态的,会随着匹配到的服
             </bean>                                                     务动态增减。
                                                                         List没有超时属性,而且是只读的。



             <!--reference-list方式-->
             <reference-list id="orderRefs" interface="com.osgi.bs.IOrderService"
             availability="optional">
             	   <reference-listener bind-method="bind" unbind-method="unbind">
             	   	   <bean class="com.osgi.bs.ReferenceListener"/>
             	   </reference-listener>
             </reference-list>




11年4月2日星期六
BluePrint服务 VS 声明式服务
       ‣     通过不同的方式实现组件和服务的管理
       ‣     声明式服务重点关注快速构建轻量级的组件模型
       ‣     BluePrint服务则面向现有的Java开发者构建富组件模型
       ‣     R4.0发布DS,R4.2发布BS
       ‣     目前DS应用更为广泛,BS则前景广阔




11年4月2日星期六
OSGi与Web应用
       ‣     在Web应用中引入OSGi的好处:
       ✓      Modularity——改进物理和逻辑结构,易于部署和维护
       ✓      Lifecycle——动态安装|使用|更新|卸载
       ✓      Services——动态解偶和依赖




11年4月2日星期六
OSGi与Web应用
       ‣     集成的两种方式:
       ✓     HttpService
       ✓     Bridged




11年4月2日星期六
tion we have been using in Toast.
                               Bridged—In the Bridged approach, the coding and exposure model
                               same as in Solo, but here the OSGi framework is embedded into a w
       OSGi与Web应用
                                                           Servlets

       ‣     集成的两种方式:       JSPs
       ✓     HttpService
       ✓     Bridged               HTTP

                                            OSGi

                                             Java

                           Figure 19–1 Solo server-side configuration




11年4月2日星期六
tion we have been using in Toast.
                                                                                                   Bridged—In the Bridged approach, the coding and exposure model
                                                                                                   same as in Solo, but here the OSGi framework is embedded into a w
       OSGi与Web应用
                                                                                                                            Servlets

       ‣     集成的两种方式:                                                                           JSPs
                       !"#$$%&'()*+,-../00123%0454006%78%972:;0<28=2&:0>4;05?>?00@A>50#!


       ✓     HttpService
       ✓     Bridged          19.2 Embedding the Back End in a Web Application                         HTTP                            323


                                                                                                              OSGi
                                                                                     Servlets
                                                                                                              Java
                                              JSPs
                                                                                            Figure 19–1 Solo server-side configuration



                                                     HTTP


                                                             Lite HTTP Bridge

                                                            OSGiEquinox
                                                                 Framework


                                                            Application Server

                                           Figure 19–2 Bridged server-side configuration
11年4月2日星期六
第三种武器——WAB
       ‣     WAB——Web Application Bundle1.0(R4.2)
       ‣     以Bundle形式部署在OSGi框架中,提供Web应用的功能
       ‣     支持Servlet2.5和JSP2.1

             Manifest-Version: 1.0
             Import-Package: ...
             ...
             Bundle-Version: 1.0
             Bundle-Name: orderManager
             Bundle-ClassPath: WEB-INF/lib/commons-logging.jar,WEB-INF/
             classes
             Web-ContextPath: /order
             Bundle-ManifestVersion: 2
             Bundle-SymbolicName: com.osgi.bs.order




11年4月2日星期六
Web Bundle Architecture

             Web Application
                                        Bundles
                Bundles




             Deploy Bundle       Admin Console Bundle




               Application Server/OSGi Runtime


                               JVM

11年4月2日星期六
Web Bundle Architecture

             Web Application
                                        Bundles
                Bundles




             Deploy Bundle       Admin Console Bundle




               Application Server/OSGi Runtime


                               JVM

11年4月2日星期六
开源实践
       ‣     Equinox——最成熟的OSGi开源实现,Eclipse的插件基础
       ‣     Gemini (Spring DM)——实现了R4.2中的企业级规范
       ‣     Virgo (Spring DM Server)——基于OSGi的Application Server
       ‣     Felix——另一个成熟的OSGi开源实现
       ‣     Nuxeo——企业级CMS,实现了部分OSGi规范




11年4月2日星期六
Questions?   Follow me at
                          twitter.com/sagacity
                          t.sina.com.cn/n/池建强




11年4月2日星期六
杭州站 · 2011年10月20日~22日
 www.qconhangzhou.com(6月启动)




QCon北京站官方网站和资料下载
     www.qconbeijing.com

More Related Content

Viewers also liked

Viewers also liked (20)

Razas, lenguas, arte5 (blog)
Razas, lenguas, arte5 (blog)Razas, lenguas, arte5 (blog)
Razas, lenguas, arte5 (blog)
 
Buen uso del internet
Buen uso del internetBuen uso del internet
Buen uso del internet
 
TABELA OFICIAL DOS JEP´S 2014. TODOS OS JOGOS.
TABELA OFICIAL DOS JEP´S 2014. TODOS OS JOGOS.TABELA OFICIAL DOS JEP´S 2014. TODOS OS JOGOS.
TABELA OFICIAL DOS JEP´S 2014. TODOS OS JOGOS.
 
Proyecto supersopa
Proyecto supersopaProyecto supersopa
Proyecto supersopa
 
Causes i consequencies presentació
Causes i consequencies presentacióCauses i consequencies presentació
Causes i consequencies presentació
 
Fairtrade Informe Anual en Espanol
Fairtrade Informe Anual en EspanolFairtrade Informe Anual en Espanol
Fairtrade Informe Anual en Espanol
 
Artículo sobre la educacion
Artículo sobre la educacionArtículo sobre la educacion
Artículo sobre la educacion
 
Lecture 2 math 2
Lecture 2 math 2Lecture 2 math 2
Lecture 2 math 2
 
D. ley 6704_12_agosto_1963
D. ley 6704_12_agosto_1963D. ley 6704_12_agosto_1963
D. ley 6704_12_agosto_1963
 
El barroco sevillano
El barroco sevillanoEl barroco sevillano
El barroco sevillano
 
Evaluacion 4
Evaluacion 4Evaluacion 4
Evaluacion 4
 
Kronika 18.08.12
Kronika 18.08.12Kronika 18.08.12
Kronika 18.08.12
 
Geralnews25jan
Geralnews25janGeralnews25jan
Geralnews25jan
 
Cartas de evita que perón não leu
Cartas de evita que perón não leuCartas de evita que perón não leu
Cartas de evita que perón não leu
 
Modelo de calidad acreditacion universitaria
Modelo de calidad acreditacion universitariaModelo de calidad acreditacion universitaria
Modelo de calidad acreditacion universitaria
 
Analitica web-sevilla-2012 v2
Analitica web-sevilla-2012 v2Analitica web-sevilla-2012 v2
Analitica web-sevilla-2012 v2
 
Binouze
BinouzeBinouze
Binouze
 
Corporate newalia 2012
Corporate newalia 2012Corporate newalia 2012
Corporate newalia 2012
 
Testes Ágeis - Quallis
Testes Ágeis - QuallisTestes Ágeis - Quallis
Testes Ágeis - Quallis
 
A eficácia da comunicação
A eficácia da comunicaçãoA eficácia da comunicação
A eficácia da comunicação
 

Similar to Ufida design-chijianqiang-qcon

Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台drewz lin
 
网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维guiyingshenxia
 
网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维colderboy17
 
阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路mysqlops
 
阿里云 张旭 集群运维管理平台
阿里云 张旭 集群运维管理平台阿里云 张旭 集群运维管理平台
阿里云 张旭 集群运维管理平台guiyingshenxia
 
集群运维管理平台
集群运维管理平台集群运维管理平台
集群运维管理平台mysqlops
 
Oracle总体技术架构解决方案
Oracle总体技术架构解决方案Oracle总体技术架构解决方案
Oracle总体技术架构解决方案jiangqiao
 
中国移动Boss3.0技术方案
中国移动Boss3.0技术方案中国移动Boss3.0技术方案
中国移动Boss3.0技术方案yiditushe
 
Top100summit 高楼-7点测试-zee-性能测试案例分享
Top100summit 高楼-7点测试-zee-性能测试案例分享Top100summit 高楼-7点测试-zee-性能测试案例分享
Top100summit 高楼-7点测试-zee-性能测试案例分享drewz lin
 
Request Management
Request ManagementRequest Management
Request ManagementSun Wei
 
从运维系统的开发谈安全架构设计
从运维系统的开发谈安全架构设计从运维系统的开发谈安全架构设计
从运维系统的开发谈安全架构设计mysqlops
 
企业信息系统性能优化实战
企业信息系统性能优化实战企业信息系统性能优化实战
企业信息系统性能优化实战mysqlops
 
Actuate presentation 2011
Actuate presentation   2011Actuate presentation   2011
Actuate presentation 2011Luke Han
 
民间秘方
民间秘方民间秘方
民间秘方dynasty
 
(宇宏)Talend工具說明
(宇宏)Talend工具說明(宇宏)Talend工具說明
(宇宏)Talend工具說明Sonny Chen
 
百度自动化运维中的关系管理
百度自动化运维中的关系管理百度自动化运维中的关系管理
百度自动化运维中的关系管理mysqlops
 
蔡学镛 - 深入浅出符合事件处理
蔡学镛 - 深入浅出符合事件处理蔡学镛 - 深入浅出符合事件处理
蔡学镛 - 深入浅出符合事件处理d0nn9n
 
JNC WMS Solution
JNC WMS SolutionJNC WMS Solution
JNC WMS SolutionJncits Tsai
 
Jnc wms solution
Jnc wms solutionJnc wms solution
Jnc wms solutionJncits Tsai
 
Sap net weaver®业务流程管理
Sap net weaver®业务流程管理Sap net weaver®业务流程管理
Sap net weaver®业务流程管理Bravo XU
 

Similar to Ufida design-chijianqiang-qcon (20)

Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台Top100summit用友 池建强-构建企业级应用开发平台
Top100summit用友 池建强-构建企业级应用开发平台
 
网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维
 
网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维
 
阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路阿里巴巴运维团队的无状态运维思路
阿里巴巴运维团队的无状态运维思路
 
阿里云 张旭 集群运维管理平台
阿里云 张旭 集群运维管理平台阿里云 张旭 集群运维管理平台
阿里云 张旭 集群运维管理平台
 
集群运维管理平台
集群运维管理平台集群运维管理平台
集群运维管理平台
 
Oracle总体技术架构解决方案
Oracle总体技术架构解决方案Oracle总体技术架构解决方案
Oracle总体技术架构解决方案
 
中国移动Boss3.0技术方案
中国移动Boss3.0技术方案中国移动Boss3.0技术方案
中国移动Boss3.0技术方案
 
Top100summit 高楼-7点测试-zee-性能测试案例分享
Top100summit 高楼-7点测试-zee-性能测试案例分享Top100summit 高楼-7点测试-zee-性能测试案例分享
Top100summit 高楼-7点测试-zee-性能测试案例分享
 
Request Management
Request ManagementRequest Management
Request Management
 
从运维系统的开发谈安全架构设计
从运维系统的开发谈安全架构设计从运维系统的开发谈安全架构设计
从运维系统的开发谈安全架构设计
 
企业信息系统性能优化实战
企业信息系统性能优化实战企业信息系统性能优化实战
企业信息系统性能优化实战
 
Actuate presentation 2011
Actuate presentation   2011Actuate presentation   2011
Actuate presentation 2011
 
民间秘方
民间秘方民间秘方
民间秘方
 
(宇宏)Talend工具說明
(宇宏)Talend工具說明(宇宏)Talend工具說明
(宇宏)Talend工具說明
 
百度自动化运维中的关系管理
百度自动化运维中的关系管理百度自动化运维中的关系管理
百度自动化运维中的关系管理
 
蔡学镛 - 深入浅出符合事件处理
蔡学镛 - 深入浅出符合事件处理蔡学镛 - 深入浅出符合事件处理
蔡学镛 - 深入浅出符合事件处理
 
JNC WMS Solution
JNC WMS SolutionJNC WMS Solution
JNC WMS Solution
 
Jnc wms solution
Jnc wms solutionJnc wms solution
Jnc wms solution
 
Sap net weaver®业务流程管理
Sap net weaver®业务流程管理Sap net weaver®业务流程管理
Sap net weaver®业务流程管理
 

More from Yiwei Ma

Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconYiwei Ma
 
Alibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qconAlibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qconYiwei Ma
 
Zhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qconZhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qconYiwei Ma
 
Taobao practice-liyu-qcon
Taobao practice-liyu-qconTaobao practice-liyu-qcon
Taobao practice-liyu-qconYiwei Ma
 
Thoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qconThoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qconYiwei Ma
 
Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qconYiwei Ma
 
Netflix web-adrian-qcon
Netflix web-adrian-qconNetflix web-adrian-qcon
Netflix web-adrian-qconYiwei Ma
 
Google arch-fangkun-qcon
Google arch-fangkun-qconGoogle arch-fangkun-qcon
Google arch-fangkun-qconYiwei Ma
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Alibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qconAlibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qconYiwei Ma
 
Twitter keynote-evan-qcon
Twitter keynote-evan-qconTwitter keynote-evan-qcon
Twitter keynote-evan-qconYiwei Ma
 
Netflix keynote-adrian-qcon
Netflix keynote-adrian-qconNetflix keynote-adrian-qcon
Netflix keynote-adrian-qconYiwei Ma
 
Facebook keynote-nicolas-qcon
Facebook keynote-nicolas-qconFacebook keynote-nicolas-qcon
Facebook keynote-nicolas-qconYiwei Ma
 
Domainlang keynote-eric-qcon
Domainlang keynote-eric-qconDomainlang keynote-eric-qcon
Domainlang keynote-eric-qconYiwei Ma
 
Devjam keynote-david-qcon
Devjam keynote-david-qconDevjam keynote-david-qcon
Devjam keynote-david-qconYiwei Ma
 
Baidu keynote-wubo-qcon
Baidu keynote-wubo-qconBaidu keynote-wubo-qcon
Baidu keynote-wubo-qconYiwei Ma
 
淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011Yiwei Ma
 
网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011Yiwei Ma
 

More from Yiwei Ma (20)

Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qcon
 
Alibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qconAlibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qcon
 
Zhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qconZhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qcon
 
Taobao practice-liyu-qcon
Taobao practice-liyu-qconTaobao practice-liyu-qcon
Taobao practice-liyu-qcon
 
Thoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qconThoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qcon
 
Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qcon
 
Netflix web-adrian-qcon
Netflix web-adrian-qconNetflix web-adrian-qcon
Netflix web-adrian-qcon
 
Google arch-fangkun-qcon
Google arch-fangkun-qconGoogle arch-fangkun-qcon
Google arch-fangkun-qcon
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Alibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qconAlibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qcon
 
Twitter keynote-evan-qcon
Twitter keynote-evan-qconTwitter keynote-evan-qcon
Twitter keynote-evan-qcon
 
Netflix keynote-adrian-qcon
Netflix keynote-adrian-qconNetflix keynote-adrian-qcon
Netflix keynote-adrian-qcon
 
Facebook keynote-nicolas-qcon
Facebook keynote-nicolas-qconFacebook keynote-nicolas-qcon
Facebook keynote-nicolas-qcon
 
Domainlang keynote-eric-qcon
Domainlang keynote-eric-qconDomainlang keynote-eric-qcon
Domainlang keynote-eric-qcon
 
Devjam keynote-david-qcon
Devjam keynote-david-qconDevjam keynote-david-qcon
Devjam keynote-david-qcon
 
Baidu keynote-wubo-qcon
Baidu keynote-wubo-qconBaidu keynote-wubo-qcon
Baidu keynote-wubo-qcon
 
淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011
 
网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011
 

Ufida design-chijianqiang-qcon

  • 1. 企业级软件的组件化和动态化开发实践 池建强--@sagacity 用友集团-瑞友科技-IT应用研究院 www.ufida.com www.rayootech.com 11年4月2日星期六
  • 2. 大纲 ‣ 软件开发之殇 ‣ 组件化与动态化 ‣ 基于WTP Facet、XDoclet、ANT的组件构建 ‣ OSGi——兄弟,全靠你了 ‣ 展望:所有的Java应用都是Bundle 11年4月2日星期六
  • 3. 现代人类文明运行于软件之上, 而软件的构建过程却隐于黑暗里,多 少青春的日子耗费在了软件的缺陷上 11年4月2日星期六
  • 4. 从软件系统诞生 之初,程序员们就 开始梦想有一天能 够像建造桥梁和房 屋那样“透明”的构 造软件,实现“即插 即用”的软件系统 11年4月2日星期六
  • 5. 但是到目前为 止,软件的开发依 然让我们倍感挫 折,失败的软件项 目有增无减,我们 还在路上 11年4月2日星期六
  • 6. 但是到目前为 止,软件的开发依 然让我们倍感挫 折,失败的软件项 目有增无减,我们 还在路上 11年4月2日星期六
  • 9. 组件化与动态化 ‣ 组件化 ‣ 动态化 ‣ 完整的业务逻辑单元 ‣ 动态的改变组件的状态 ‣ 解决某一方面的问题 ‣ 动态的改变数据和数据结构 ‣ 每个组件可以独立开发 ‣ 动态的修改业务流程 ‣ 实现组织级复用 ‣ 动态的调整业务规则 ‣ 按需分配 ‣ 动态的分配资源 ‣ 动态的安装启动停止卸载 ‣ 动态的计算 11年4月2日星期六
  • 10. Metadata 组件化与动态化 Workflow ‣ 组件化 ‣ 动态化 RuleEngine ‣ 完整的业务逻辑单元 ‣ 动态的改变组件的状态 ‣ 解决某一方面的问题 ‣ 动态的改变数据和数据结构 ‣ 每个组件可以独立开发 ‣ 动态的修改业务流程 ‣ 实现组织级复用 ‣ 动态的调整业务规则 ‣ 按需分配 ‣ 动态的分配资源 ‣ 动态的安装启动停止卸载 ‣ 动态的计算 Component Building 11年4月2日星期六
  • 11. 企业级软件开发遇到的挑战 ‣ 组织级复用 ‣ 不是复制粘贴,不是简单的代码、接口或算法的复用 ‣ 没人愿意编写重复代码 ‣ 复用是永远的痛——200个表的故事 ‣ 组件的管理 ‣ 组件的独立开发 ‣ 组件的依赖关系 ‣ 自动构建——机器的活得让机器干 11年4月2日星期六
  • 12. 我们遇到的... 电子商务平台 ERP业务平台 Flex 银企直联平台 报表 AJAX 组 织 规则引擎 任务调度 数 接 权 工 据 口 限 作 字 服 业务日志 流 典 务 引 管 擎 消息 全文检索 理 Main FrameWork 11年4月2日星期六
  • 13. 我们遇到的... 电子商务平台 ERP业务平台 Flex 银企直联平台 报表 AJAX 组 织 规则引擎 任务调度 数 接 权 工 据 口 限 作 字 服 业务日志 流 典 务 引 管 擎 消息 全文检索 理 Main FrameWork 11年4月2日星期六
  • 14. 我们遇到的... 电子商务平台 ERP业务平台 Here you are! Flex 银企直联平台 报表 AJAX 组 织 规则引擎 任务调度 数 接 权 工 据 口 限 作 字 服 业务日志 流 典 务 引 管 擎 消息 全文检索 理 Main FrameWork 11年4月2日星期六
  • 15. 我们希望的... Flex AJAX 电子商务平台 消息 监控 银企直联平台 ERP业务平台 预警 短信 接 报表 规则引擎 组 工 数 口 织 作 据 服 权 流 字 务 业务日志 任务调度 引 限 典 管 擎 理 消息 全文检索 GAP-API Main FrameWork 11年4月2日星期六
  • 16. 开发实践 ‣ Eclipse WTP Facets ‣ XDoclet ‣ Ant ‣ 为什么当时没有采用OSGi ‣ 资源文件的处理 ‣ Servlet容器的支持 ‣ 持久化、事务 11年4月2日星期六
  • 17. Eclipse WTP Facets ‣ 提供了优秀的扩展机制 ‣ 对WTP(Web Tools Platform)平台进行扩展 ‣ 创建WTP项目时增加自定义的组件 ‣ 提供组件的依赖关系和多版本管理 ‣ Facets允许开发人员以组件集成的方式来创建项目,像搭积木一 样把各种组件进行组合并完成最终构建,是面向组件开发的一 种实现机制 ‣ Facets不提供运行时组件生命周期的管理 11年4月2日星期六
  • 18. 核心的WTP Faceted包括以下内容: id versions requires conflicts jst.java 1.3, 1.4, 1.5, 1.6 jst.ear jst.web 2.2, 2.3, 2.4 jst.java jst.ear, jst.ejb jst.ear 1.2, 1.3, 1.4, 5.0, 6.0 jst.java jst.ejb 1.1, 2.0, 2.1, 3.0, 3.1 jst.java jst.ear, jst.java 11年4月2日星期六
  • 19. 核心的WTP Faceted包括以下内容: id versions requires conflicts jst.java 1.3, 1.4, 1.5, 1.6 jst.ear jst.web 2.2, 2.3, 2.4 jst.java jst.ear, jst.ejb jst.ear 1.2, 1.3, 1.4, 5.0, 6.0 jst.java jst.ejb 1.1, 2.0, 2.1, 3.0, 3.1 jst.java jst.ear, jst.java 11年4月2日星期六
  • 21. 创建一个标准的Dynamic Web Project Facets 11年4月2日星期六
  • 22. XDoclet & Ant ‣ XDoclet:优秀的文本处理和构建工具 ‣ 资源文件处理、Merge Point ‣ Ant: 历史悠久的构建脚本工具 ‣ 独立组件构建 ‣ 整体构建 ‣ Facets Ant XDoclet 11年4月2日星期六
  • 23. 组件化开发实践 ‣ 各组件独立开发,独立构建(build.xml) ‣ 公共资源文件处理-MergePoint(i18n,oid,spring,include) ‣ 整体构建(TotalBuild) ‣ 基于Facet机制装配组件 11年4月2日星期六
  • 25. 实际效果 TotalBuild 11年4月2日星期六
  • 26. 实际效果 TotalBuild 11年4月2日星期六
  • 27. 实际效果 TotalBuild Facets 11年4月2日星期六
  • 28. 开始实践之旅 ‣ 各组件独立研发,依赖框架,依赖接口 ‣ 编写自己的build.xml,实现clean compile jar distribution db merge resource ‣ 在组件项目的根目录下执行ant src webModule ‣ 构建出统一目录结构的Distribution 11年4月2日星期六
  • 29. 公共资源文件处理(Merge) ‣ 建立公共模板文件,文件后缀设置为xdt ‣ applicationContext.xdt------------spring ‣ global.xdt---------------------------include global.jsp ‣ web.xdt-----------------------------web.xml ‣ ...... ‣ 设置Merge Point <XDtMerge:merge file="workflow-hbm.data"></XDtMerge:merge> 11年4月2日星期六
  • 30. Merge文件的内容 <value>gap/wf/persistent/db/bo/GapwfProcessinstance.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfActivityinstance.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfActivityinstancepre.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfRevelantdata.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfWorkitem.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfWorkitemdata.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfDynprocessrelation.hbm.xml</value> db merge resource src webModule 11年4月2日星期六
  • 31. XDoclet构建 <path id="xdoclet.classpath"> <fileset dir="${lib.dir}"> <include name="*.jar"/> ‣ 设置XDoclet的classpath </fileset> <pathelement location="classes"/> ‣ 设置Ant的taskdef </path> ‣ 定义target <taskdef name="xdoclet" classname="xdoclet.DocletTask" classpathref="xdoclet.classpath" /> <target name="gen-applicationContext.xml"> <xdoclet destdir="${webmodule.dir}/WEB-INF/conf/applicationContext" force='true' mergedir="${merge.dir}"> <fileset dir="${source.dir}" includes="**/*.java" /> <template templateFile="template/applicationContext.xdt" destinationfile="applicationContext.xml" /> </xdoclet> </target> 11年4月2日星期六
  • 32. TotalBuild ‣ 构建Facets项目所需要的组件内容 <!--调用各个组件的build.xml--> <target name="build"> <ant dir="${gap-api}" antfile="build.xml" target="all" /> <ant dir="${venus-frame}" antfile="build.xml" target="all" /> <ant dir="${venus-page}" antfile="build.xml" target="all" /> <ant dir="${venus-log}" antfile="build.xml" target="all" /> ...... </target> <!--重命名--> <target name="plugin"> <available file="Templates" type="dir" property="Templates.present" /> <antcall target="clean" /> <move todir="Templates/0. 主程序框架"> <fileset dir="${gap-api}/dist" /> <fileset dir="${venus-frame}/dist" /> </move> ...... </target> 11年4月2日星期六
  • 33. 构建我们自己的Facet ‣ 创建基于org.eclipse.ui.newWizards的扩展点 ‣ 设置category和wizard,实现独立的项目向导 11年4月2日星期六
  • 34. 核心扩展点 ‣ org.eclipse.wst.common.project.facet.core.facets ‣ <category />——Facet的类别 ‣ <project-facet />——Facet的属性描述 ‣ <project-facet-version />——Facet的版本处理 ‣ <template />——设置必选的Facet ‣ <preset />——预置Facet集合 辅助扩展点——增加图标和向导页面 ‣ org.eclipse.wst.common.project.facet.ui.images ‣ org.eclipse.wst.common.project.facet.ui.wizard 11年4月2日星期六
  • 35. Facet的核心配置 <!--Facet的基础信息配置--> <project-facet id="gap.mainframe"> <label>0. 主程序框架</label> <description>GAP平台的基础框架</description> <category>gap.category</category> </project-facet> <!--设置Facet的某个版本的相关信息(安装代理类,约束等)--> <project-facet-version facet="gap.mainframe" version="3.7"> <action id="gap.mainframe.install" type="INSTALL"> <delegate class="venus.tools.ide.facet.GAPFacetInstallDelegate"/> </action> <constraint> <requires facet="jst.web" version="[2.4"/> </constraint> </project-facet-version> 11年4月2日星期六
  • 36. Facet的两个代理类 ‣ 实现接口:org.eclipse.wst.common.project.facet.core.IDelegate ‣ GAPFacetInstallDelegate:负责负责所有实体Facet的安装 ‣ BuildFacetsDelegate: ‣ 虚拟Facet,在所有实体Facet安装完成后调用 ‣ 负责Facet的装配策略 ‣ 创建配置文件、驱动XDoclet进行文件合并、设置classpath ‣ 创建project的nature(.tomcatplugin) ‣ 删除不需要的文件 11年4月2日星期六
  • 37. 解决了哪些问题 ‣ 组件的独立开发 ‣ 组件的组合与依赖关系 ‣ 组件版本管理 ‣ 按需分配 ‣ 最终实现了组织级别的复用 11年4月2日星期六
  • 38. 遗留问题 ‣ 能装不能拆,无法实现物理隔离 ‣ 独立jar包的版本冲突 ‣ 运行时动态的生命周期管理(Install、Update、Remove) ‣ Time For: 11年4月2日星期六
  • 39. 遗留问题 ‣ 能装不能拆,无法实现物理隔离 ‣ 独立jar包的版本冲突 ‣ Time For: 运行时动态的生命周期管理(Install、Update、Remove) ‣ Time For: O Gi 11年4月2日星期六
  • 40. OSGi ‣ 天将降大任 ‣ 2005,R4.0发布——最好的年代,也是最坏的年代 ‣ 2010年3月,OSGi企业级规范4.2正式发布 ‣ 世界是你的,也是我的,归根结底应该是由Bundle构建的 ‣ 完美的解决方案 11年4月2日星期六
  • 41. update install refresh INSTALLED STARTING resolve update start refresh RESOLVED ACTIVE stop uninstall uninstall stop UNINSTALLED STOPPING 11年4月2日星期六
  • 42. OSGi 企业级特性 ‣ 声明式服务(Declarative Services) ‣ 框架加载(Framework Launching) ‣ Blueprint服务(Blueprint Service) ‣ Web应用(Web Application Bundle) ‣ 远程服务 日志服务 JPA JTA JDBC...... 11年4月2日星期六
  • 43. OSGi 企业级特性 ‣ 声明式服务(Declarative Services) ‣ 框架加载(Framework Launching) ‣ Blueprint服务(Blueprint Service) ‣ Web应用(Web Application Bundle) ‣ 远程服务 日志服务 JPA JTA JDBC...... 11年4月2日星期六
  • 44. 声明式服务 ‣ Service Component Model ‣ 通过声明的方式实现OSGi服务的发布、查找和绑定 ‣ 通过xml的方式定义Component和Service ‣ 引用服务和提供服务都以接口的方式定义 ‣ 允许以纯Java POJO的方式开发组件,不依赖OSGi框架 ‣ 更容易测试和模拟 11年4月2日星期六
  • 45. 声明式服务——提供服务和消费服务 ‣ 在Bundle的Manifest中定义一个或多个组件文件 Bundle-ManifestVersion: 2 ... Service-Component: OSGI-INF/component.xml [, ...]* ‣ 在OSGI-INF/目录下编写组件文件 <?xml version="1.0" encoding="UTF-8"?> <scr:component name="bookstore-order" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"> <!--该组件的实现类--> <implementation class="com.osgi.ds.OrderService"/> <!--提供的服务--> <service><provide interface="com.osgi.ds.IOrder"/></service> <!--消费的服务--> <reference interface="com.osgi.ds.ICart" bind="setCart" unbind="unsetCart" policy="dynamic" cardinality="1..1"/> </scr:component> 11年4月2日星期六
  • 46. 声明式服务——组件的生命周期 ‣ Enabled——组件的启动 ‣ Satisfied——满足组件的配置信息 ‣ Immediate Component——立即激活组件 ‣ Delayed Component——延迟加载组件 ‣ Factory Component——工厂组件 11年4月2日星期六
  • 47. <=>%42.*%0$1-.*$0%*+$%#(45("$"*%#(")-120&*-("%&.%&%.$09-#$%-"%*+$%.$09-#$%0$1-.*0'%& *+$%#(45("$"*%#(")-120&*-("7%?+$%.$09-#$%50(5$0*-$.%)(0%*+-.%0$1-.*0&*-("%#(".-.*%() 50(5$0*-$.%&.%/$)-"$/%-"%+),-&.)/0,12),%&)#%("%5&1$ @AB7 ?+$%.*&*$%/-&10&4%-.%.+(:"%-"%C-120$%@@D7D7% 声明式服务——组件的生命周期 3&4!,)/55676 899)*&$%)/:1921")"%/:1"(&4!,$%&1" )(+=,*>+,( 6789:&8;&<3 ‣ Enabled——组件的启动 B&)/0&2 2,-$2.$&C B&)/0&2 Satisfied——满足组件的配置信息 D62,-$2.$&C ‣ +=,*>+,( $.%CA6,0$)E 9.:&?< !"#$"%&%'()*+&(!,-.&( /&-.010'*2&(3&12*-&4(3$&-*+*-0'*"%(5& '&B$6C$69 ‣ Immediate Component——立即激活组件 !"#$%&#'&()*+&#(&,*'$&(&-#./#0#+12314&4$#+14"*,5(0$*14#.&+12&'#545'&-#.&+05'&#$%&(&#0(&#4 .54-6&'#5'*4,#*$7#$%&4#89:#'%156-#-&0+$*)0$&#$%0$#+12314&4$#+14"*,5(0$*14;#<%*'#0661='#89 !!"#$#2 3(4+5()-./'0/1(1,- ‣ Delayed Component——延迟加载组件 2&4$0$*14'#$1#&0,&(6/#(&+60*2#0+$*)0$&-#+12314&4$#+14"*,5(0$*14'; 8%E$'%&**0-62*$%()%&%/$,&'$/%#(45("$"*%-.%*+$%/$,&'-"1%()%#,&..%,(&/-"1%&"/%(6F$#*%#0$ !"#$%&'(()*+ *+$%&#*-9&*-("%()%&%/$,&'$/%#(45("$"*%#(")-120&*-("%/($.%"(*%(##20%2"*-,%*+$0$%-.%& ,&-./&0'123425&56'1257"#$%.6"25 ‣ Factory Component——工厂组件 )(0%&%.$09-#$%(6F$#*7%8%#(45("$"*%-.%&%/$,&'$/%#(45("$"*%:+$"%-*%.5$#-)-$.%&%.$09-#$ *(0'%#(45("$"*%&"/%/($.%"(*%+&9$%*+$%!""#$!%&#%&**0-62*$%()%*+$%'(")(*#*&%$,$4 <1&'(:;&(1 2345674%789 <=>%42.*%0$1-.*$0%&%.$09-#$%&)*$0%*+$%#(45("$"*%#(")-120&*-("%6$#(4$.%.&*-.)-$/7%? *+-.%.$09-#$%42.*%,((E%*(%(6.$09$0.%()%*+$%.$09-#$%0$1-.*0'%&.%-)%*+$%#(45("$"*I.%62" B&-"#&4 B&-"#&4 *$0$/%*+-.%.$09-#$7%?+-.%.*0&*$1'%4&E$.%-*%5(..-6,$%*(%0$1-.*$0%.$09-#$.%:-*+(2*%#0$&*-" D%40'*4+*&C 40'*4+*&C )(0%*+$%62"/,$%&"/%,(&/-"1%#,&..$.3%*+$0$6'%&,,(:-"1%0$/2#*-("%-"%-"-*-&,-J&*-("%*-4$ 4$4(0'%)((*50-"*7 >8?7468>89 D%9&' B&-"#&4 4&12*-& D%40'*4+*&C K+$"%<=>%0$1-.*$0.%*+$%.$09-#$%("%6$+&,)%()%&%#(45("$"*%#(")-120&*-("3%-*%42.*%&9( 6 9&' 4&12*-&+0-'"1,E(F77% ,(&/%*(%(##20%)0(4%*+$%#(45("$"*L.%62"/,$7%<=>%#&"%$".20$%*+-.%6'%0$1-.*$0-"1%&%-# 4&12*-& "'G&1H*4&E(6 (6F$#*%:-*+%*+$%C0&4$:(0E%)(0%*+&*%.$09-#$7%M'%0$1-.*$0-"1%&%-#+.!'#/%'&(+0%(6F$#*3%* &'(:;&(1 (6F$#*%-.%"(*%"$$/$/%2"*-,%*+$%-#+.!'#/%'&(+0%-.%#&,,$/%*(%50(9-/$%*+$%.$09-#$%(6F$#*7% *+(C,%0#*-E 5-67=8 1&B*%C*%9 $0*-$.%)(0%*+-.%0$1-.*0&*-("%#(".-.*%()%*+$%#(45("$"*%50(5$0*-$.%&.%/$)-"$/%-"%+),-&.)/ @AB7 ?+$%&#*-9&*-("%()%&%#(45("$"*%#(")-120&*-("%42.*%6$%/$,&'$/%2"*-,%-*.%.$09-#$%-.%0$G 11年4月2日星期六
  • 48. 框架加载 ‣ R4.2提供了一套标准的API用来启动OSGi容器 ‣ 各OSGi框架都需要实现——org.osgi.framework.launch.FrameworkFactory ‣ 允许在容器外启停OSGi框架,例如在web容器中通过listener启动OSGi ‣ 示例代码如下: Class<FrameworkFactory> factoryClass = ServiceLoader.load(FrameworkFactory.class); FrameworkFactory factory = factoryClass.newInstance(); Map<Object, Object> conf; ......//初始化配置信息 Framework framework=factory.newFramework(conf); framework.init(); BundleContext bundleContext = framework.getBundleContext(); ......//安装bundle framework.start(); 11年4月2日星期六
  • 49. BluePrint服务 ‣ BluePrint的基础——Spring Dynamic Modules-->Eclipse Gemini ‣ 为OSGi定义了依赖注入(dependency injection)框架 ‣ 处理OSGi服务的动态性 ‣ 与POJO协同工作 ‣ OSGI-INF/blueprint/ <?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> ... </blueprint> 11年4月2日星期六
  • 50. 3&45"$,67689 :$0;,(%"5)%5"$ 5&'( BluePrint服务——Bean管理器 9 ‣ 创建具有给定参数和属性的 Java 对象的实例 ‣ 管理对象的生命周期 ',+7/&(1 0,.0&,18 ‣ argument, property, scope ‣ 构建方式:className, factoryMethod, factoryComponent !"!#$#" 45&'(6 !"#$G#%&2&%&$3.'$&$7#&-$/&-&(#'$+,$'#*'#,#-%#2$+-$%"#$$/&.#0&'.1.'.$+-%#'3& <bean id="order" class="com.osgi.bs.OrderService" init-method="init" destroy-method="destroy"> 2(3)(#&#'0&'.1.'.<$!&70# CBC<C$.-$*&(# BCI$*'.5+2#,$&-$.5#'5+#9$.3$%"#$'# <argument value="1"/> <argument value="2"/> &-2$%"#$/&.#0&'.1.'.$+-%#'3&6#<$!"#$%&70#$.-0)$*'.5+2#,$&$,1//&')4$%"#$,./ %+.-,$7#%9##-$%"#$2+33#'#-%$3#&%1'#,$&'#$2+,61,,#2$+-$0&%#'$,#6%+.-,< <property name="Description" value="This is the order"/> </bean> <01/$,67686 :$0;,=0;04$",3$0%5"$' :11,;571&).,)<=&/&(1 >8(1'? %&'()*&1'@'1' A&BC,;01;.( "1 45 "16 !"#$+2$.3$&$%.*$0 11年4月2日星期六 768'*"#$ 7#$1-+;1#$+-$%"
  • 51. BluePrint服务——服务注册 <!--服务注册--> <service id="orderService" interface="com.osgi.bs.IOrderService" ref="order"> <service-properties> <entry key="order.discount" value="0.8"/> </service-properties> </service> <!--实际代码--> OrderService os = new OrderService(1, 2); os.setDescription( "This is the order" ); Hashtable props = new Hashtable(); props.put("order.discount", "0.8"); bundleContext.registerService(com.osgi.bs.OrderService.class.getName(), os, props); 11年4月2日星期六
  • 52. BluePrint服务——服务引用 <!--reference方式--> <reference id="orderRef" interface="com.osgi.bs.IOrderService" timeout="1000" availability="optional"/> <bean id="orderClient" class="..."> <property name="order" ref="orderRef"/> </bean> <!--reference-list方式--> <reference-list id="orderRefs" interface="com.osgi.bs.IOrderService" availability="optional"> <reference-listener bind-method="bind" unbind-method="unbind"> <bean class="com.osgi.bs.ReferenceListener"/> </reference-listener> </reference-list> 11年4月2日星期六
  • 53. BluePrint服务——服务引用 <!--reference方式--> <reference id="orderRef" interface="com.osgi.bs.IOrderService" timeout="1000" availability="optional"/> <bean id="orderClient" class="..."> <property name="order" ref="orderRef"/> List中的对象是动态的,会随着匹配到的服 </bean> 务动态增减。 List没有超时属性,而且是只读的。 <!--reference-list方式--> <reference-list id="orderRefs" interface="com.osgi.bs.IOrderService" availability="optional"> <reference-listener bind-method="bind" unbind-method="unbind"> <bean class="com.osgi.bs.ReferenceListener"/> </reference-listener> </reference-list> 11年4月2日星期六
  • 54. BluePrint服务 VS 声明式服务 ‣ 通过不同的方式实现组件和服务的管理 ‣ 声明式服务重点关注快速构建轻量级的组件模型 ‣ BluePrint服务则面向现有的Java开发者构建富组件模型 ‣ R4.0发布DS,R4.2发布BS ‣ 目前DS应用更为广泛,BS则前景广阔 11年4月2日星期六
  • 55. OSGi与Web应用 ‣ 在Web应用中引入OSGi的好处: ✓ Modularity——改进物理和逻辑结构,易于部署和维护 ✓ Lifecycle——动态安装|使用|更新|卸载 ✓ Services——动态解偶和依赖 11年4月2日星期六
  • 56. OSGi与Web应用 ‣ 集成的两种方式: ✓ HttpService ✓ Bridged 11年4月2日星期六
  • 57. tion we have been using in Toast. Bridged—In the Bridged approach, the coding and exposure model same as in Solo, but here the OSGi framework is embedded into a w OSGi与Web应用 Servlets ‣ 集成的两种方式: JSPs ✓ HttpService ✓ Bridged HTTP OSGi Java Figure 19–1 Solo server-side configuration 11年4月2日星期六
  • 58. tion we have been using in Toast. Bridged—In the Bridged approach, the coding and exposure model same as in Solo, but here the OSGi framework is embedded into a w OSGi与Web应用 Servlets ‣ 集成的两种方式: JSPs !"#$$%&'()*+,-../00123%0454006%78%972:;0<28=2&:0>4;05?>?00@A>50#! ✓ HttpService ✓ Bridged 19.2 Embedding the Back End in a Web Application HTTP 323 OSGi Servlets Java JSPs Figure 19–1 Solo server-side configuration HTTP Lite HTTP Bridge OSGiEquinox Framework Application Server Figure 19–2 Bridged server-side configuration 11年4月2日星期六
  • 59. 第三种武器——WAB ‣ WAB——Web Application Bundle1.0(R4.2) ‣ 以Bundle形式部署在OSGi框架中,提供Web应用的功能 ‣ 支持Servlet2.5和JSP2.1 Manifest-Version: 1.0 Import-Package: ... ... Bundle-Version: 1.0 Bundle-Name: orderManager Bundle-ClassPath: WEB-INF/lib/commons-logging.jar,WEB-INF/ classes Web-ContextPath: /order Bundle-ManifestVersion: 2 Bundle-SymbolicName: com.osgi.bs.order 11年4月2日星期六
  • 60. Web Bundle Architecture Web Application Bundles Bundles Deploy Bundle Admin Console Bundle Application Server/OSGi Runtime JVM 11年4月2日星期六
  • 61. Web Bundle Architecture Web Application Bundles Bundles Deploy Bundle Admin Console Bundle Application Server/OSGi Runtime JVM 11年4月2日星期六
  • 62. 开源实践 ‣ Equinox——最成熟的OSGi开源实现,Eclipse的插件基础 ‣ Gemini (Spring DM)——实现了R4.2中的企业级规范 ‣ Virgo (Spring DM Server)——基于OSGi的Application Server ‣ Felix——另一个成熟的OSGi开源实现 ‣ Nuxeo——企业级CMS,实现了部分OSGi规范 11年4月2日星期六
  • 63. Questions? Follow me at twitter.com/sagacity t.sina.com.cn/n/池建强 11年4月2日星期六
  • 64. 杭州站 · 2011年10月20日~22日 www.qconhangzhou.com(6月启动) QCon北京站官方网站和资料下载 www.qconbeijing.com