OSGi入门与实战

上传人:沈*** 文档编号:155546891 上传时间:2022-09-23 格式:DOC 页数:30 大小:1.07MB
收藏 版权申诉 举报 下载
OSGi入门与实战_第1页
第1页 / 共30页
OSGi入门与实战_第2页
第2页 / 共30页
OSGi入门与实战_第3页
第3页 / 共30页
资源描述:

《OSGi入门与实战》由会员分享,可在线阅读,更多相关《OSGi入门与实战(30页珍藏版)》请在装配图网上搜索。

1、初探Java企业级开源框架OSGi(1) 2009-03-02 09:22 51CTO.com 我要评论()OSGi框架在国外关注率是很高,但在国内的推广和使用却不够广泛,可能是因为OSGi字面上的意思太过于抽象。本文作者通过对OSGi产生背景与特性的描述像大家详细介绍了OSGi,并通过一个Hello World的实力带您详细了解OSGi的运行机制。第一次接触OSGi 是2006年看见的一则网上新闻,该新闻中提到BMW 汽车的通信-娱乐(infotainment)系统采用了OSGi 架构,这套系统主要用来控制汽车上的音箱、灯光、导航和通讯等设备,整个系统由1000多个模块组成,启动时间却只需要

2、3.5秒钟,这对于一个基于Java 的框架来讲,具有两个重大意义:一、说明了Java 执行效率并不差;二、OSGi 框架的性能尤其优秀。因此笔者对OSGi 框架产生了极大的兴趣,后来终于在一个项目中负责研究和开发基于OSGi 框架的应用程序,从此对它便情有独钟。令人欣慰的是,OSGi 在2007年取得了诸多战果:BEA 公司、Eclipse 基金会和Interface21 公司相继加入OSGi 联盟;在EclipseCon 2007大会上引起了业界的广泛关注,其中以Spring-OSGi、Web Service 与OSGi 等技术最为引人注目,这也标志着OSGi 将在未来与企业应用紧密结合;O

3、SGi R4 标准发布,相关内容被成功的写入JSR 291 规范中;Spring 2.5 框架的发布,宣称其所有jar 包都兼容OSGi 标准;虽然OSGi 没能成功进入JavaEE 6 草拟计划中,但是Sun 公司宣称会在下一代Java EE 标准中重点考虑OSGi。因此笔者个人认为,在不久的将来OSGi 势必会在企业应用中发挥出强大的作用,基于OSGi 框架的产品也将层出不穷。本文从OSGi 的历史背景、OSGi 的特点、OSGi 开源框架介绍、OSGi 开发环境部署、OSGi 版的Hello World 五个部分对OSGi 框架进行概要的介绍,希望读者能从中有所收获。51CTO编辑推荐:

4、OSGi入门与实践全攻略OSGi 的历史背景什么是OSGi 呢?OSGiOpen Service Gateway Initiative 字面上的意思是一个公共的服务平台。1999年OSGi 联盟成立,它是一个非盈利的国际组织,旨在建立一个开放的服务规范,为通过网络向设备提供服务建立开放的标准,是开放业务网关的发起者。OSGi 联盟的初始目标是构建一个在广域网和局域网或设备上展开业务的基础平台。历史总是具有惊人的相似性,正如Java 诞生于一个嵌入式开发的项目中,却被应用于网络平台的开发,对OSGi 的最早设计也是针对嵌入式应用的,诸如机顶盒、服务网关、手机、汽车等都是其应用的主要环境。后来,由

5、于OSGi 的诸多优秀特性(可动态改变系统行为,热插拔的插件体系结构,高可复用性,高效性等等),它被应用于许多PC 上的应用开发,因此逐步为开发者所知和钟爱。现在人们对OSGi 的理解已经远远不是它字面和初衷所能解释的了,笔者认为称其为一个轻巧的、松耦合的、面向服务的应用程序开发框架更为确切一些。OSGi 真正被大家所知还是和Eclipse 有密切关系的。Eclipse 很多年都是Java 开发者的首选IDE,相信只要是一个Java 开发者,应该没有人不知道Eclipse 的。在Eclipse 3.0 以前的版本中,它本身有一套自身的插件体系,而该插件体系的设计非常精巧细致,受到许多开发者的推

6、崇,但是Eclipse 基金在Eclipse 3.0 发布的时候,做出了一个大胆的行为,就是将Eclipse 逐步迁移到OSGi 框架中,并自己实现了一个OSGi 开源框架,取名为Equinox,该框架随着每次Eclipse 的发布也会相应的更新。Eclipse 之所以这么做,其一是因为Eclipse 的插件体系与OSGi 的设计思想不谋而合,其二也是因为OSGi 更为规范,其对插件体系的定义也更为完整一些。事实证明Eclipse 在采用OSGi 架构后,无论从性能、可扩展性这两个方面来讲还是从二次开发的角度来定义,都取得巨大的成功。下图展示了Eclipse 与OSGi 框架的关系。OSGi

7、的特点在介绍OSGi 框架的特点之前,先简单的介绍一下OSGi 框架的各个部分,如下图所示。解释一下上图中每一层的含义,其中OS 层和JVM 层可以不用详细介绍了,重点需要关注的是应用程序Bundles 层。框架本身提供的类加载,生命周期管理,服务注册和规范服务也都是针对Bundles 的。每一个在OSGi 框架中运行的逻辑单元称为一个Bundle,Bundle 实际是一个符合特定形式的jar 文件。每一个Bundle 的功能可以是抽象的也可以是具体的。所谓抽象,就是它不是一个具体的应用,没有完成一些业务功能,而只暴露了一些接口或者功能给其他的Bundle 使用;所谓具体,就是该Bundle

8、可以独立的完成一个功能,例如连接数据库,获取数据等等。Bundle 有六种状态,分别是:installed(安装完成,本地资源成功加载),resolved(依赖关系满足,即该Bundle 要么是准备好运行了,要么是已经被停止了),starting(Bundle 正在被启动),stopping(Bundle 正在被停止),active(Bundle 被激活,正在运行中),uninstalled(Bundle 被卸载了,被卸载了)。OSGi 有它自身的类加载机制从而控制这些加载的Bundles 彼此之间的依赖关系,而生命周期管理也是OSGi 的一大亮点,由于可动态的对这些加载的Bundles 进行

9、安装、卸载、启动、停止等操作,所以可以动态的改变应用程序的运行状态。当一系列的Bundles 存在于服务器中的时候,那么它们之间必然会存在通信协作的部分,比如说一个通过网页捕获用户输入的Bundle 执行的时候,它必须首先需要一个Web 服务器服务的支持,那么这个时候服务注册器就会从整个OSGi容器中寻找这个服务,如果能完成服务的匹配,那么相应的功能就会很自然的实现了。OSGi 规范还规定了一组预设的服务,包括日志、服务管理等等,这些服务在主流的开源框架中都有实现。OSGi 框架中还包括一个安全层,OSGi 的安全层扩展了Java 的安全机制,增并加了一些新的约束以填补了Java安全机制中的遗

10、漏。基于上述的介绍,读者想必应对OSGi 有个大致的概念了,那么接下来就让我们来看看OSGi 究竟能够给企业应用带来什么?它究竟有哪些功能值得我们把宝贵的时间投资在上面?第一点,也是笔者认为最重要的一点,基于OSGi 的应用程序可动态更改运行状态和行为。笔者曾经参与过开发J2EE 企业级项目,应用服务器用的是IBM 的Websphere,主要开发基于EJB 2.1 的一些应用程序。整个开发经历给笔者的最深印象是等待,排除编写EJB 规范中要求的一系列繁杂的接口,单单对应用程序进行部署和测试,反复启动服务器就浪费掉很多时间。而在OSGi 框架中,每一个Bundle 实际上都是可热插拔的,因此,对

11、一个特定的Bundle 进行修改不会影响到容器中的所有应用,运行的大部分应用还是可以照常工作。当你将修改后的Bundle 再部署上去的时候,容器从来没有重新启过,在外界看来,这种过程似乎从未发生过。这种可动态更改状态的特性在一些及时性很强的系统中尤其重要,比如说一个及时销售系统,当你的服务器因为要更新某个组件从而花上数分钟时间重新启动的话,必然导致客户的流失和利益的损失,但是采用OSGi 架构的应用则完全可以将损失降到最低。众所周知,Spring 框架以其优秀的特性,占据了当前企业应用开发的半边天空,而刚刚发布的2.5 版本,宣布所有jar 包均支持OSGi 特性,其维护的子项目Spring-

12、OSGi 也是专门针对Spring 与OSGi 的集成。Spring 早前版本有一点被人所诟病,就是其无法动态的改变其运行状态,被迫停止服务器,再修改配置文件,而与OSGi 的结合,必然导致这种状态的终结。最后,笔者认为这种特性也保证了系统有足够的灵活性和可扩展性,对开发人员也大大节省了需要等待的时间。第二点,它是一个稳定高效的系统。OSGi 是一个微核的系统,所谓微核是指其核心只有为数不多的几个jar 包。基于OSGi 框架的系统可分可合,其结构的优势性导致具体的Bundle 不至于影响到全局,不会因为局部的错误导致全局系统的崩溃。每个Bundle 也只有当服务被调用的时候才会启动,因此性能

13、是较一般的框架高出许多。第三点,可复用性强。OSGi 框架本身可复用性极强,很容易构建真正面向接口的程序架构,每一个Bundle 都是一个独立可复用的单元。但是采用OSGi 框架进行企业开发是需要气魄和勇气的,因为当前的软件企业,大多已经积累了许多年,都会遗留下来一些可复用的工具箱程序,而采用OSGi 架构需要重新对这些遗留系统进行封装,更有可能的是需要把整个体系架构打散了,进行重新的架构和排列。这个开发成本不能说是不高,但笔者认为是值得的,因为从此以后企业可以利用OSGi 独特的特性,将重复的知识轻易的过滤掉。对于新的开发,可以从企业的Bundles 库中精简出可复用的模块,量身定做新的Bu

14、ndles,最大限度的利用了以前的积累,这样的过程更能促使企业竞争力的增强。OSGi 开源框架介绍当前的OSGi 开源框架主要包含如下几个:Equinox最知名,也是更新最频繁的,由于Eclipse 基金的支持,其功能越来越完善,笔者后续的具体开发都是基于该框架来实现的。当前已发布版本是3.3.1 与Eclipse 版本相同,实现了OSGi R4 规范,并提供很多平台性质的服务,包括:常用功能模块、日志模块、Web服务器模块、Servlet 模块、JSP 解析模块等等。由于其与Eclipse 的天然联系,使得开发基于Equinox 的应用程序变得很简单,笔者推荐采用此框架进行二次开发。具体内容

15、可以从http:/www.eclipse.org/equinox/ 下载。Knopflerfish很早的,也很优秀的一个OSGi 框架,也实现了OSGi R4 标准,去年十一月发布了其2.0.2版本。该项目的宗旨在于创建一个易于开发的OSGi 平台,与Equinox 不同之处在于它本身提供一些小应用实例,包括一个可视化控制台等,也提供基于Eclipse 的插件。具体内容可以从http:/www.knopflerfish.org/ 下载。Felix很新的一个OSGi 框架,社区很活跃,更新频率高,是Apache 的开源项目。该项目2007年8月才出1.0 版,也实现了OSGi R4 规范,也提供

16、相关的基础服务和扩展服务功能。具体内容可以从http:/felix.apache.org/site/index.html 下载。OSGi 开发环境部署讲了那么多原理,如果不动手实践一下,总是难以令人信服的。那么现在我们就开始动手搭建开发环境吧。首先,你需要准备好Eclipse 笔者用的是Eclipse 3.3.1 ,还有从Equinox 网站上下载到的Equinox SDK。其次,将Equinox SDK 解压,解压后是一个Eclipse 目录,将该目录下的所有内容拷贝至你的Eclipse 安装目录下,就像平时手动安装Eclipse 插件一样。最后,测试下是否安装成功。启动你的Eclipse,

17、选择RunOpen Run Dialog.在弹出的界面中,如果出现了OSGi Framework 的选项,那基本上就是成功了。点击新建一个OSGi Run方式,这时会列出一系列的加载组件,你可以检查一下,如果里面有org.eclipse.osgi ,org.eclipse.osgi.services 和一系列以org.eclipse.equinox 开头的组件,那么就真的安装成功了。选中org.eclipse.osgi 和org.eclipse.osgi.services,点击Run 按钮,控制台会出现“osgi”的提示,输入“ss”,就会看到你运行的这两个Bundles 的ID和状态了。每次

18、输入错误的时候,控制台会打印出完整的命令列表,读者可以在此参考。OSGi 版HelloWorld到了真的写一个HelloWorld 的时候了,该应用设计如下图:这个应用包含五个Bundles:SayHello Bundle 包含一个接口,只有唯一的方法sayHello();BobSays、RodSays、KentSays 三个Bundles 分别实现了三个具体的sayHello();而SayHelloService Bundle 提供了说hello 的机会,是具体的一个服务应用,在功能上有点类似于main 函数的味道。这个HelloWorld demo 的目的不但可以让读者小试牛刀,而且可以同

19、时体会一下OSGi 最大的优点服务状态的可更改性。BobSays、RodSays、KentSays 实现了SayHello 暴露的接口,它们是sayHello 的具体执行者,但是在SayHelloService 调用的过程中,我们可以动态的改变到底是谁来说。为了实现这个demo,还需要简单介绍一下OSGi 最简单的实现机制:OSGi Bundles 之间包的依赖关系。每一个OSGi Bundle 的类文件可分为私有的、引入的、暴露的三种,如下图所示在OSGi 中Exported Classes 是以包的方式暴露的,如图所示,SayHello 中暴露了接口所在的包,对应的BobSays等三个Bu

20、ndles 和SayHelloService Bundle 都引入了该包,这是OSGi 中最简单的通信方式,OSGi 规范中推荐使用面向服务的通信方式,这里只是举一个简单的实例,因此不用做的那么复杂。回到正题,启动你的Eclipse,新建一个名为SayHello 的plug-in project,在Target Platform 选项中,选择an OSGi Framework:Equinox。笔者自己设置了Activator 路径为org.osgi.demo.sayHello.Activator,每个Activator 都具有两个方法,start() 和 stop(),这两个方法是该bundl

21、e 启动、停止的时候,调用的方法,通常在这里注册、初始化或注销该Bundle 服务的过程,这里不需要更改任何Activator 中的内容,用系统自动生成的就可以了。在建立好项目后,会出现对SayHello 项目的配置,这里可以通过dependencies 选项卡,设置需要的plug-in 和引入的package;可以通过runtime 选项卡的设置,确定暴露哪些包。我们新建一个org.osgi.demo.say 包,并建立SayHello 接口,只有一个返回void的方法sayHello() ,并将此包设为暴露的。这些设置都保存在项目的META-INF目录下的MANIFEST.MF文件中,以后

22、要更改的话,只需打开该文件即可。 SayHello 接口的代码如下:public interface SayHello public void sayHello();同样类似的新建一个名为BobSays 的plug-in project。笔者设置的包为org.osgi.demo.bob,这里需要在配置dependencies 的时候,将包org.osgi.demo.say 引入。创建新的类BobSays,代码如下:public class BobSays implements SayHello public void sayHello() System.out.println(Bob says

23、 Hello OSGi world); 这里需要覆写在BobSays Bundle 中的Activator 的两个方法,具体代码如下:public class Activator implements BundleActivator private ServiceRegistration serviceReg = null; public void start(BundleContext context) throws Exception serviceReg = context.registerService(SayHello.class.getName(), new BobSays(),

24、null);/ 1 public void stop(BundleContext context) throws Exception if (serviceReg != null) serviceReg.unregister();/ 2 完成的主要功能是:1、在启动服务的时候,注册BoySays 服务为一个SayHello 服务;2、在停止服务的时候,从上下文中卸载该服务。类似的创建KentSays、RodSays 两个project。最后,创建一个名为SayHelloService 的plug-in project。笔者设置的包为org.osgi.demo.service,同样在配置depe

25、ndencies 的时候,将包org.osgi.demo.say 引入。创建SayHelloService类,代码如下:public class SayHelloService private SayHello say; public void helloWorld() for (int i = 0; i 10; i+) try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace(); System.err.println(Thread cant sleep); say.sayHello(); public

26、void setSay(SayHello say) this.say = say; 这里采用依赖注入的方式,所以有一个setSay() 方法,来设置一个具体的SayHello。helloWorld() 方法就是调用特定的SayHello.sayHello() 来完成的,用10秒钟的时间打印十次sayHello() 的具体内容。该Bundle 的Activator 代码如下:public class Activator implements BundleActivator private ServiceRegistration serviceReg = null; public void sta

27、rt(BundleContext context) throws Exception SayHelloService sayService = new SayHelloService(); serviceReg = context.registerService(SayHelloService.class.getName(), sayService, null);/ 1 ServiceReference serviceRef = context .getServiceReference(SayHello.class.getName();/ 2 sayService.setSay(SayHell

28、o) context.getService(serviceRef);/ 2 sayService.helloWorld();/ 3 public void stop(BundleContext context) throws Exception if (serviceReg != null) serviceReg.unregister(); 完成的主要功能是:1、注册SayHelloService 服务;2、获取一个的SayHello 服务;3、并注入到SayHelloService 服务中,现在注入的服务是从服务上下文中具体获取的,而到底是哪个,只有在运行时状态才能决定。至此,所有的Bund

29、les 我们都已经完成了,选择Open Run Dialog.,并选中上述五个Bundles 和OSGi 核心Bundle,点击Run 按钮。输入“ss”,列出了6个Bundles 的状态,此时,如果你的SayHelloService Bundle 状态是Resolved,那么你可以通过命令“start SayHelloService Bundle 状态的id”,启动SayHelloService,此时你会看到打印出的10条hello world信息。读者可以手动利用用命令“start” 和“stop” 改变sayHello 的具体执行者,动态的更换实际sayHello 的执行者。这个简单的H

30、elloWorld 应用,可以说明SayHelloService 在具体执行的过程中行为是可动态改变的,并且改变只是局部的。小结读完本文,实际动手做过HelloWorld,想必读者对OSGi 框架也应该有所了解了,OSGi 框架在国外关注率是挺高的,但是在国内的推广和使用却不够广泛,可能是因为OSGi 字面上的意思太过于抽象,因此笔者在这里将这个优秀的框架介绍给大家,本片只是一个简单的介绍,并不涉及OSGi 框架深入的知识。【编辑推荐】1. 探索Eclipse的OSGi控制台 2. OSGi企业级分布式ModuleFusion1.0.1发布 3. OSGi和未来Java企业开发的方向 OSGi

31、体系结构 OSGi Pure Plugin Architecture Introduction原创作者: erylee 阅读:1642次 评论:0条 更新时间:2006-12-28OSGi 的初衷是面向嵌入式系统的应用,支持在一个Java虚拟机上加载和启动多个Java应用程序。随着OSGi在Eclipse3.0上的应用成功,其逐渐成为构建纯插件结构的企业级应用软件系统的首选平台。OSGi 是一个纯插件的体系结构,OSGi 框架实现是一个最为核心的插件,逻辑实现分层见下面两张图: L0层Java执行环境 OSGi最初规范定位到嵌入式系统,例如家电、汽车、手机等执行环境,所以插件要配置适合的运行环

32、境与Policy。当OSGi框架加载插件时会对插件要求的执行环境做校验。例如,Eclipse中可以配置下图中的执行环境:L1模块层(组件或插件层)L1模块层(插件层 或 组件层)定义插件的ClassLoading策略(Policy),这也是OSGi最为出色和吸引人的地方。我们知道,任何一个Java平台的插件体系结 构,首先要解决的是ClassLoading的问题。OSGi在Java动态ClassLoading基础之上,提供了完美的插件 ClassLoading解决方案。传统J2SE程序,有单一的Classpath包含所有的classes与resources,L1插件层为每个 OSGi插件提供了

33、私有的Classpath和独立的Classloader,有效的控制了插件间的Class隔离、依赖与协作。插件间的Class依赖关系见下图(版权归www.osgi.org):插件的类空间(Class Space)见下图(版权归www.osgi.org):插件的类加载过程:L2插件生命周期管理层 L2层负责运行时动态安装(Install)、启动(Start)、停止(Stop)、更新(Update)或卸载(Uninstall)插件。插件的生命周期见下图(版权归www.osgi.org):L3服务注册层 L3提供了一个动态的服务注册模型,插件可以注册(register)、发现(lookup)、使用(r

34、eference)服务。该层的服务注册采用ServiceLocator模式,见下面图示:该层的实现由于没有直接的IoC容器支持,被很多过分相信IoC作用的人所批评。Martin Fowler曾经说过,“说一个系统是基于IoC的,就好像说一个汽车有四个轮子”,IoC只不过是一种模式和设计原则,任何一个设计得比较好的面向对象 系统都或多或少的具备这样的特征,这与存不存在一个独立的IoC容器关系不大,尽管IoC容器在开发上带来很大的便利与优势。另外一个方面,IoC容器本 质上还是一个Service Registry,只不过增加依赖装配功能,所以在OSGi的服务注册模型上,可以很容易的支持IoC。Op

35、enCore在该层的服务模型下实现了非常灵活的分级IoC容器,支持插件级、应用程序级、网络级的IoC功能。 基于 OSGi 和 Spring 开发 Web 应用文档选项打印本页窗体顶端将此页作为电子邮件发送未显示需要 JavaScript 的文档选项窗体底端级别: 初级张 晓宁 (zxning), 软件工程师2009 年 2 月 26 日作为一个新的事实上的工业标准,OSGi 已经受到了广泛的关注, 其面向服务(接口)的基本思想和动态模块部署的能力, 是企业级应用长期以来一直追求的目标。Spring 是一个著名的 轻量级 J2EE 开发框架,其特点是面向接口编程和非侵入式的依赖注入。将 OSG

36、i 和 Spring 结合能充分发挥二者各自的特长,更好地满足企业级应用开发的需求。Spring 开发组织在 2008 年发布了将 OSGi 和 Spring 结合的第一个版本:Spring-DM。本文通过一个简单实例,介绍如何利用 Spring-DM 开发基于 OSGi 和 Spring 架构的 Web 应用,同时探讨其中用到的关键技术及其基本思想。开发一个简单的 OSGi Web 应用实例一个简单的 Web 应用我们写一个简单的 Web 应用 compute.html :计算两个数字的和或乘积。如下图所示:图 1. 一个简单例子一个简单例子.bmp为了体现 OSGi bundle 的动态部

37、署能力,我们写两个 service bundle,其中一个计算两个数字的和(称为 add bundle),另外一个计算两个数字的积(称为 multiply bundle)。 当我们点击“Compute”按钮的时候,如果此时 add bundle 被部署,则页面将返回两个数字的和,否则如果此时 multiply bundle 被部署,则页面将返回两个数字的积。开发环境准备1. 下载 Eclipse 3.4 2. 获取所有 OSGi, Equinox 和 Spring 的插件, 如下图所示: 图 2. 相关插件列表1. 打开 Eclipse, 设置 target platform 为上述插件集合

38、基本模块设计该应用主要包含两个层次: 服务层和 Web 层。Web 层基于 Spring-MVC 实现,包含处理 Web访问相关的 bundle(本例中只有一个)。服务层包含处理数字计算的 bundle,本例中包含一个声明服务接口的 compute interface bundle 和两个实现该服务接口的 bundle :add bundle 和 multiply bundle。基本模块结构如下图所示:图 3. 基本框架模块程序实现Step 1 :实现 Service Layer服务层的三个 OSGi bundle 实现完毕之后如下图所示 :图 4. 服务层服务层.bmp其中 pute 是声明

39、服务接口的 bundle。pute.add和pute.multiply 是实现了服务接口的两个 bundle。1. pute 声明一个 Compute 接口,其中包含一个接口方法 computeNums(),如下图所示 :图 5. 服务层接口 bundle1. pute.add bundle pute.add 的基本程序结构如下图所示:图 6. 接口实现 bundle :add在该 add bundle 中,添加一个 Add 类,实现 Compute 接口,如下图所示:图 7. 接口实现代码 :Add 类注意到我们在 META-INF 下建了一个 spring 目录,并且添加了一个 compu

40、teAdd-context.xml 文件。系统启动时,Spring 将利用该 xml 文件创建一个 bean 实例,并把该 bean 输出为一个 OSGi service,如下图所示 :图 8. Spring 声明文件 :computeAdd-context.xml该xml文件中,osgi : service是 Spring-DM 输出 OSGi service 的标记,其中的 interface属性标明了该 service 实现的服务接口。1. pute.multiply 按照与 add bundle 同样的方法,实现 multiply bundle,如下图所示:图 9. 接口实现代码:Mu

41、ltiply 类接口实现代码-Multiply类.bmp类似的,添加一个 computeMultiply-context.xml 输出 OSGi service,如下图所示 :图 10. Spring 声明文件:computeMultiply-context.xmlStep 2 :实现 Web LayerWeb 层只包含一个 bundle:com.zxn.example.web,采用 Spring-MVC 和 OSGi 构建,基本程序结构如下图所示:图 11. Web Layer 程序结构1. ComputeControler.java 该JAVA类实现了 org.springframewor

42、k.web.servlet.mvc.Controller,是本 web应用中核心的 servlet,负责接受并处理 web 请求。该类调用 ComputeServiceRef 的方法实现业务逻辑。该类关键的方法是 handleRequest(), 如下图所示 :图 12. 核心 servlet 类1. ComputeServiceRef.java 该 JAVA 类负责引用部署的 service bundle 完成最终计算,其中的 computeService 由 Spring 根据 OSGi 中实际部署的 service 进行注入。本例中,实际部署的 service 可能是 add bundl

43、e 或者 multiply bundle。需要特别注意的是,此处体现了 Spring-DM 的动态特性。OSGi 的动态部署能力使得 Spring 的动态服务注入成为可能。图 13. 服务消费类1. HTTPContextResgistry.java 该 JAVA 类负责在 OSGi 环境中配置和注册 HTTP 服务,其关键方法为 bean 初始化时调用的 init( ) 方法。图 14. 在 OSGi 环境中注册 HTTP 服务该 init 方法中,第六行的 getHTTPService() 调用 OSGi 的 ServiceTracker 来获取 OSGi环境中注册的 HTTP 服务的引用

44、,如下图所示:图 15. 使用 ServiceTracker 获取 HTTP 服务1. computeWeb-context.xml 该 xml 文件主要用于配置 HTTPContextResgistry bean 类,以及导入对 Compute 服务接口的引用。标记 osgi : reference 用于声明要导入的服务接口,其 interface 属性标明了该接口的定义,本例中为 pute.Compute 接口。图 16. Spring 声明文件:导入服务接口1. computeWeb-Dispatcher.xml 该 xml 文件用于配置 ComputeControler bean类。图

45、 17. Spring 声明文件:配置核心 servlet 类回页首运行程序以往开发 J2EE 应用通常需要将应用服务器的 runtime 集成到开发环境中才能进行程序调试,非常麻烦。基于 OSGi 的应用完全可以脱离应用服务器运行,这使得程序开发和调试变得非常容易,直接在 Eclipse 中调试运行就可以。我们在 Eclipse 中将程序运行起来,如下图所示:图18. 运行 OSGi 程序从上图中看到,我们同时选择部署了 add bundle 和 multiply bundle,利用 OSGi console 察看如下:图 19. 察看部署的 OSGi bundle当 OSGi 环境中同时部

46、署有多个服务接口的实现 bundle 时,OSGi 会选择一个默认的 bundle提供服务。本例中,Spring 会默认注入 add bundle。我们通过 web 访问 compute.html 页面:图 20. 访问页面点 Compute 按钮之后,结果页面如下:图 21. 访问结果可以看出,是 add bundle 提供了计算服务。下面我们通过命令 stop 76 来停止 add bundle的服务:图 22. 停止 add bundle图 23. add bundle 状态变为 RESOLVED重新访问 compute.html 页面,结果得到的是两个数字的乘积。可以看出,是 mult

47、iply bundl 提供了计算服务。如下图所示:图 24. 再次访问页面回页首小结作为当前颇具生命力的两个标准和框架,OSGi 和 Spring 已经初步融合在一起。二者的结合,为开发企业级的 Web 应用同时提供了巨大的灵活性和动态部署能力。本文通过一个简单的例子,描述如何开发一个基于 OSGi 和 Spring 的 Web 应用,并说明了开发过程中涉及到的技术关键点。注意:本文观点仅代表作者本人,不代表 IBM 公司。参考资料 有关 Spring 和 OSGi 关联信息,请参考 Spring-OSGi 官方网站。 有光 OSGi 联盟和技术规范,请参考 OSGi Alliance。 有关 Eclipse 对 OSGi 的实现,请参考 Equinox 官方网站。 通过查阅 IBM developerWorks 的 Eclipse 项目资源,提高 Eclipse 技能。 访问 developerWorks Open source 专区,这里有丰富的 how-to 信息、工具和项目更新,可以帮助您利用开放源码技术进行开发并将其用于 IBM 产品。 关于作者张晓宁,目前在 IBM 中国软件开发中心工作,主要负责 Business Intelligence 与数据仓库方面产品的开发工作。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!