`
killko
  • 浏览: 104877 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Group-logo
Servicemix&Fu...
浏览量:0
社区版块
存档分类
最新评论

OSGI设计模式之whiteboard pattern

阅读更多
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服务即可。
3
1
分享到:
评论
3 楼 AlexWeixf 2013-08-23  
不错, OSGI改变传统JAVA设计模式哟
2 楼 killko 2013-02-25  
lg_asus 写道
感觉BundleC就是在解耦

没错!
1 楼 lg_asus 2013-02-25  
感觉BundleC就是在解耦

相关推荐

    Patterns and Best Practices for Dynamic OSGi Applications

    ### 动态OSGi应用的设计模式与最佳实践 #### 标题解读 标题“动态OSGi应用的设计模式与最佳实践”表明本文档旨在探讨在构建动态OSGi应用程序时所采用的关键设计模式和最佳实践方法。 #### 描述解读 文档描述同样...

    Java应用架构设计 模块化模式与OSGi.zip

    Java应用架构设计中,模块化模式与OSGi是两个关键概念,它们对于构建大型、可扩展且易于维护的系统至关重要。模块化模式使得代码组织更加有序,而OSGi(Open Services Gateway Initiative)则是一种实现模块化的动态...

    OSGI进阶.pdf

    6. **OSGi设计模式**:文档介绍了在OSGi中应用的设计模式,如树状设计模式和面向服务的设计模式,这些模式可以帮助开发者更好地组织和管理 bundles。 7. **OSGi最佳实践**:最后,文档总结了一系列OSGi的最佳实践,...

    Java应用架构设计模块化模式与OSGi

    Java应用架构设计中,模块化模式与OSGi是两种重要的技术,它们对于构建大型、可扩展且易于维护的系统起着关键作用。本篇将深入探讨这两个概念,以及它们如何协同工作来提升Java应用程序的效率和灵活性。 首先,模块...

    osgi进阶(中文)

    OSGi的设计模式,如树状设计模式和面向服务的设计模式,帮助开发者更好地理解和应用OSGi框架。此外,文档还提供了一系列OSGi最佳实践,如将接口和实现分离为不同的bundle、保持系统的动态性、搭建公司级的bundle ...

    java技术文档.设计模式,maven,osgi

    本技术文档涵盖了三个关键领域:设计模式、Maven项目管理和OSGI模块系统,这些都是Java开发中的核心概念。 首先,让我们深入探讨设计模式。设计模式是软件工程中的一种最佳实践,代表了在特定上下文中解决问题的...

    OSGI的servlet配置和简单实例

    在OSGI中,我们使用HTTP白板规范(HTTP Whiteboard Pattern)来处理HTTP请求。这意味着我们需要在服务注册时提供URL模式,这通常通过添加额外的属性来完成,例如`HttpContextMapper`。 ```java props.put...

    OSGi Web示例工程

    4. **部署和配置**:在OSGi环境中,Web应用程序的部署通常涉及将Web Bundle安装到OSGi容器中,配置HTTP白板服务(Http Whiteboard Pattern),使得Web请求可以路由到正确的Servlet或Filter。 5. **依赖管理**:由于...

    OSGI 服务端模式Demo [C/S架构]

    该Demo模拟了这样一个功能, 从OSGI命令行接收到一个命令: 服务名 参数1 参数2 就能将服务转发到对应的服务插件上去. 比如: AddService 12 34 这样就能将参数传递给AddService这样的服务, 并得到两个参数相加的结果

    OSGI 开发文档中文的

    6. **插件模块开发**:如何设计和实现OSGI插件,包括定义插件接口、实现业务逻辑、打包和部署。这部分内容可能涉及Maven或Gradle的OSGI插件,以及如何配置它们来生成符合OSGI规范的JAR。 7. **代码示例**:提供的...

    OSGi的培训(商业模式,架构)

    1. **灵活性与可扩展性**:OSGi的模块化设计使得软件能够轻松添加或移除功能,这对于大型企业级应用和嵌入式系统的更新迭代非常有利。 2. **资源优化**:通过按需加载和卸载模块,OSGi能有效降低内存占用和启动时间...

    osgi介绍osgi介绍

    1. **复杂性**:OSGi的模块化和动态性增加了系统的复杂性,需要更精细的规划和设计。 2. **学习曲线**:对于新开发者,理解OSGi的概念和最佳实践可能需要一定时间。 3. **调试与测试**:在OSGi环境中进行调试和测试...

    OSGI 实例eclipse插件开发

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...

    osgi资料

    - 软件设计模式:介绍如何利用OSGi实现模块化设计,提高代码复用性和可维护性。 - 配置管理:讲述如何通过配置文件控制模块的行为,适应不同环境的需求。 - 最佳实践:分享开发者在OSGi开发过程中总结的经验和...

    osgi,林昊写的osgi实战和进阶

    OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...

    OSGI组件编程(osgi.component.programming)

    OSGI组件编程是一种在Java平台上构建模块化应用程序的方法,它由OSGi联盟制定标准,并被广泛应用于企业级软件开发,尤其是对于需要高度可扩展性和动态性的系统。在本教程中,我们将深入探讨如何使用Eclipse和Equinox...

    osgi学习笔记(一)

    OSGi的架构基于服务导向的设计,允许bundle之间通过定义和查找服务进行交互。每个bundle都可以提供服务,也可以消费其他bundle提供的服务。这种模式使得组件之间的依赖关系更加明确,降低了耦合度。 在OSGi中,有一...

    OSGi service

    白板模式(Whiteboard Pattern)是解决服务监听问题的一个有效方法。在这种模式下,监听者作为服务注册,当事件发生时,所有注册的监听者都会被调用。例如,OSGi中的EventAdmin服务就采用了这种模式,确保了服务的正确...

    OSGi入门教程(OSGi Introduce)

    OSGi(Open Services Gateway Initiative)是一种Java平台上的模块化服务框架,它定义了一种标准,使得开发者能够构建可互操作的、动态的、模块化的软件系统。OSGi的核心概念是基于Java的模块化,它的主要目标是为...

Global site tag (gtag.js) - Google Analytics