OSGI的模块化带来的一个好处就是动态化。动态化就是要求软件构件之间的耦合是松散的,不会因为被依赖的构件的撤走而导致依赖它的构件的崩溃。所以,我们说在OSGI里提供了export-package/import-package的机制,但如非必要,它不能过分使用,因为如果export package的bundle被卸掉后,import package的那个bundle也会从active或resovled的状态转为installed的状态。而采用osgi service的方式则是被推荐的bundle间耦合方式(被引用的服务不存在时,bundle不会从active或resovled的状态转为installed的状态)。
从上面的描述可以看出,OSGI模块化、动态化不是说将jar包改造成bundle,并放在osgi framework上运行就能达到的,更多是和设计相关。
我们下面来看看osgi常用的whiteboard设计模式。
最开始,我是从httpServcie应用的whiteboard pattern开始认识whiteboard pattern的。但后来发现whiteboard pattern并不仅限于用在httpService方面。我们先看看httpService应用的whtieboard pattern:
一般来说,提供httpService服务的bundle(以下简称为BundleA)有点类似一个servlet容器,它会在某个端口上监听Http请求,然后发布出HttpService服务。其它bundle(以下简称为BundleB)可以引用这个HttpService,通过这个HttpService的registerServlet的方法来注册自己实现的servlet,使BundleA知道有这样的servlet(会和url作映射,和web.xml里注册servlet有个ServletMapping一样)。这样,当BundleA收到http请求后,根据url的映射,找到BundleB的servlet,并交由它处理,获得Http response,从而实现对Http请求的相应。
如果有很多个bundle各自提供了自己的servlet的话,我们就需要在每个这样的bundle里写注册自己的servlet的代码,而且由于OSGI环境的动态性,HttpService有可能在任何时间发布出来或被撤下,BundleB还不能在activator里做servlet的注册,得通过ServiceListener或ServiceTracker之类的方式来处理这些问题(当然用DS或Blueprint的方式可以简化这个操作)。这样一个小小的servlet就需要写大量的辅助代码才能达到动态性目的,而且每个这类的bundle都得做一次。另外还有Servlet的反注册问题呢!所以,显然这不是个好的解决方案。
这时我们就需要用到whiteboard pattern来简化这个工作。继续上面提及的BundleB,将BundleB的servlet发布成OSGI service(注意:不是在HttpService上注册),并将mapping pattern作为这个servlet服务的一个属性。接着,我们再做一个whiteboard Bundle(以下简称BundleC),它负责引用HttpService服务,同时监听servlet服务发布的事件。当BundleC收到servlet服务发布的事件时,就调用HttpService来注册这个Servlet。也就是说提供Servlet的所有bundle都不再需要自己写代码来注册servlet了,全由BundleC来做这个注册的工作,一劳永逸了。提供Servlet的所有bundle都只需要发布servlet服务即可。
所以,从whiteboard的字面上来理解,相当于BundleB这类提供servlet服务的bundle将servlet的相关信息“写到”osgi service registry这个“whiteboard”上,而BundleA也将自己提供的HttpService服务“写到”osgi service registry这个“whiteboard”上,BundleC则利用这个“whiteboard”上的“信息”来完成注册servlet的工作。
无论BundleC是用ServiceListener还是ServiceTracker来处理动态性,这些代码都由BundleC封装了,其它bundle就只需要发布Servlet服务即可。
分享到:
相关推荐
osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍osgi介绍
Java应用架构设计模块化模式与OSGi
《Java应用架构设计 模块化模式与OSGi》PDF版本下载
Neil Bartlett 2008年9月出炉的最新OSGi in Practice 的完整版,目录如下: ...The Whiteboard Pattern Declarative Services The Extender Model Integrating Third-party Libraries Building Web Applications
Java应用架构设计 模块化模式与OSGi
该Demo模拟了这样一个功能, 从OSGI命令行接收到一个命令: 服务名 参数1 参数2 就能将服务转发到对应的服务插件上去. 比如: AddService 12 34 这样就能将参数传递给AddService这样的服务, 并得到两个参数相加的结果
资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
基于OSGi框架之开发环境搭建基于OSGi框架之开发环境搭建
利用R-OSGi实现分布式OSGi应用 本文通过介绍传统 OSGi 应用程序及 R-OSGi 的实现方式入手,阐述了 R-OSGi 对于 OSGi 规范的实现方式。然后通过一个简单的功能实现由浅入深地讲述传统 OSGi 和 R-OSGi 上的两种不同...
OSGi的培训资料,包括架构,市场前景,目前模式。
网上收集的OSGI资料. 包括: OSGi原理与最佳实践(精选版).pdf OSGI实战和源码.rar osgi进阶.pdf Introduce.OSGi.ppt OSGi.in.action.ppt r4.cmpn.pdf r4.core.pdf r4.enterprise.pdf
文内难免有些错误,还请大家不吝指正,也希望本文能作为国内 OSGI 的抛砖之作,引出更多的关于 OSGI的 Opendoc,在我的 blog 上也会不断的编写关于自己在 OSGI、Equinox 上的实战的体会和心得,欢迎大家多多交流。
讲OSGI应用的讲OSGI应用的讲OSGI应用的讲OSGI应用的讲OSGI应用的
OSGI 实例 eclipse 插件开发
OSGI 入门资料PDF,包括OSGI实战、OSGI进阶、OSGI 入门和整合Spring、OSGI原理与最佳实践
《 OSGi实战》是学习OSGi的全面指导,利用与架构和开发人员相关的示例清楚地讲解OSGi概念,同时探讨了很多实践场景和技术,阐述了开发人员有多需要OSGi,怎么将OSGi嵌入其他容器中,将遗留系统移入OSGi的最佳实践,...
OSGi的入门教程,帮助初学者快速了解OSGi的定义、用途及组成。
osgi,林昊写的osgi实战和进阶,学习osgi的好东西,入门的首选。
OSGi开发文档和实践指南,描述了OSGI的开发流程