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应用程序时所采用的关键设计模式和最佳实践方法。 #### 描述解读 文档描述同样...
Java应用架构设计中,模块化模式与OSGi是两个关键概念,它们对于构建大型、可扩展且易于维护的系统至关重要。模块化模式使得代码组织更加有序,而OSGi(Open Services Gateway Initiative)则是一种实现模块化的动态...
6. **OSGi设计模式**:文档介绍了在OSGi中应用的设计模式,如树状设计模式和面向服务的设计模式,这些模式可以帮助开发者更好地组织和管理 bundles。 7. **OSGi最佳实践**:最后,文档总结了一系列OSGi的最佳实践,...
Java应用架构设计中,模块化模式与OSGi是两种重要的技术,它们对于构建大型、可扩展且易于维护的系统起着关键作用。本篇将深入探讨这两个概念,以及它们如何协同工作来提升Java应用程序的效率和灵活性。 首先,模块...
OSGi的设计模式,如树状设计模式和面向服务的设计模式,帮助开发者更好地理解和应用OSGi框架。此外,文档还提供了一系列OSGi最佳实践,如将接口和实现分离为不同的bundle、保持系统的动态性、搭建公司级的bundle ...
本技术文档涵盖了三个关键领域:设计模式、Maven项目管理和OSGI模块系统,这些都是Java开发中的核心概念。 首先,让我们深入探讨设计模式。设计模式是软件工程中的一种最佳实践,代表了在特定上下文中解决问题的...
在OSGI中,我们使用HTTP白板规范(HTTP Whiteboard Pattern)来处理HTTP请求。这意味着我们需要在服务注册时提供URL模式,这通常通过添加额外的属性来完成,例如`HttpContextMapper`。 ```java props.put...
4. **部署和配置**:在OSGi环境中,Web应用程序的部署通常涉及将Web Bundle安装到OSGi容器中,配置HTTP白板服务(Http Whiteboard Pattern),使得Web请求可以路由到正确的Servlet或Filter。 5. **依赖管理**:由于...
该Demo模拟了这样一个功能, 从OSGI命令行接收到一个命令: 服务名 参数1 参数2 就能将服务转发到对应的服务插件上去. 比如: AddService 12 34 这样就能将参数传递给AddService这样的服务, 并得到两个参数相加的结果
6. **插件模块开发**:如何设计和实现OSGI插件,包括定义插件接口、实现业务逻辑、打包和部署。这部分内容可能涉及Maven或Gradle的OSGI插件,以及如何配置它们来生成符合OSGI规范的JAR。 7. **代码示例**:提供的...
1. **灵活性与可扩展性**:OSGi的模块化设计使得软件能够轻松添加或移除功能,这对于大型企业级应用和嵌入式系统的更新迭代非常有利。 2. **资源优化**:通过按需加载和卸载模块,OSGi能有效降低内存占用和启动时间...
1. **复杂性**:OSGi的模块化和动态性增加了系统的复杂性,需要更精细的规划和设计。 2. **学习曲线**:对于新开发者,理解OSGi的概念和最佳实践可能需要一定时间。 3. **调试与测试**:在OSGi环境中进行调试和测试...
OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...
- 软件设计模式:介绍如何利用OSGi实现模块化设计,提高代码复用性和可维护性。 - 配置管理:讲述如何通过配置文件控制模块的行为,适应不同环境的需求。 - 最佳实践:分享开发者在OSGi开发过程中总结的经验和...
OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...
OSGI组件编程是一种在Java平台上构建模块化应用程序的方法,它由OSGi联盟制定标准,并被广泛应用于企业级软件开发,尤其是对于需要高度可扩展性和动态性的系统。在本教程中,我们将深入探讨如何使用Eclipse和Equinox...
OSGi的架构基于服务导向的设计,允许bundle之间通过定义和查找服务进行交互。每个bundle都可以提供服务,也可以消费其他bundle提供的服务。这种模式使得组件之间的依赖关系更加明确,降低了耦合度。 在OSGi中,有一...
白板模式(Whiteboard Pattern)是解决服务监听问题的一个有效方法。在这种模式下,监听者作为服务注册,当事件发生时,所有注册的监听者都会被调用。例如,OSGi中的EventAdmin服务就采用了这种模式,确保了服务的正确...
OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...