OSGi的CM就是Configuration Admin Service,是用于管理Bundle属性、并在属性发生变更时通知相应的Service,可以看出,这是保持OSGi动态性的很关键的一个服务,毕竟配置属性的修改是会发生的,象修改了Http的端口呀等,但又不希望修改这些属性后需要重启才能生效,那么CM是一个不错的选择,使用CM时无需关心属性具体怎么存储这些问题,而在属性修改后CM也会自动通知相关的service。
通常在系统的属性管理上,我们的需求通常是在一个统一的界面上对系统的相关属性进行统一的配置,保存后则希望能通知相应的服务,这里面的属性自然有些是公用的,有些是某些模块专用的,既然基于CM来实现这样的需求,首先来看看基于CM需要怎么去做,这是基于CM的统一管理系统属性的典型的序列图:
其中ConfigurationAdminService、ManagedService均为CM中定义的规范的服务接口,而ConfigManageAction就是用于实现统一管理属性配置的web响应接口了,根据上图可以看出,通过调用ConfigurationAdminService的getConfiguration方法可以获取到Configuration对象,通过这个对象可以获取到配置的属性集合,而通过Configuration对象的update方法就可以更新属性了,ConfigurationAdminService在更新属性时将异步的调用系统中对外提供了ManagedService的服务的update方法,该方法的参数即为更新的属性的集合。
首先要说明下CM对于属性是怎么进行存储的,CM对于属性的存储是根据服务注册时提供的service.pid的值(必须是唯一的)以及Bundle Location(Bundle的地址)构成key来存储其属性的,按照这样的过程,在维护属性时自然也要以这个为Key来进行操作,同样的,在通知属性更新时CM也是根据这个key的值来决定的,但实现ManagedService的服务只能传入service.pid这个值,Bundle Location的值CM将自动的获取该服务所属的Bundle的Location,这看似设计的很好,但同时在应用层面则带来了一个问题,后面将会讲到。
假设我们的需求是这样的:
1、A Bundle中的PortService的port属性需要管理,BookService的bookcount属性需要配置;
2、B Bundle中的PortConfigService的port属性需要管理,MenuService中的menucount属性需要配置;
3、其中A Bundle中的PortService所需的port和B Bundle中的PortConfigService所需的port属性是相同的;
4、属性统一在C Bundle中通过提供web界面的管理方式来实现,在属性发生变化时要通知相应Bundle的Service。
那么根据上面对于CM的讲解我们来实现这个需求:
1、PortService、BookService、PortConfigService、MenuService均需实现ManagedService接口,ManagedService接口中只有一个方法update(Dictionary props),当service关注的属性被更新时CM将会自动的通知,然后服务根据属性自行的做出相应的处理;
2、PortService、BookService、PortConfigService、MenuService对外提供ManagedService接口,在注册时提供service.pid属性的值,这个值必须是唯一的,假设分别为a.port、a.bookservice、b.port、b.menuservice;
3、实现ConfigManageAction,配置页面上自然是只有port、bookcount和menucount三个属性需要配置的了,由于CM是采用service.pid加上Bundle的Location来构成key的,而在通知属性更新上也是根据这个key来决定,那么这其实也就已经意味着ConfigManageAction在管理这几个属性时必须带上相应的Bundle的Location了,这是不太合理的地方,首先要获取Bundle的Location是比较麻烦的事,其次是这样也就意味着ConfigManageAction是必须知道当属性变更时需要通知到哪些Bundle的,如果将来增加一个Bundle的服务需要监听某已经存在的属性的话,就必须要修改ConfigManageAction的代码,当然,这和注册的服务监听的server.pid的属性必须唯一也有关,也就是说CM其实只是一个基于Event的一对一的订阅/发布模型,这就导致了在维护一个port这样的公共属性的时候竟然要在A Bundle的PortService和B Bundle的PortConfigService中各存一份,OSGi联盟对于此的解释是出于安全问题的考虑,所以在CM的设计上采取了加上Bundle Location做为Key的原因。
在这样的情况下,也就导致了ConfigManageAction变得复杂了......
CM在这块设计上欠缺对于应用级属性(共享配置属性)上的考虑绝对是有待商讨的,现在只能是在各个Bundle中各自维护一套,同时在各自Bundle中提供一个ConfigManageService这样的服务来更新当前Bundle中的属性,这样才能解决Bundle Location的那个问题,在目前的情况下就没法构成共有属性的维护方式了,如果是公有属性变化的话也就只有在ConfigManageAction中调用相关的多个Bundle的ConfigManageService来完成属性的修改了,这样的话存储和动态的通知仍然交由CM去完成了。
关于模块的耦合上只有个小小的想法讨论下,就是做为设计师你能否很快的告诉别人搭建你其中的一个模块的工程需要哪几个模块的支撑,或者最好就是运行检验你其中的一个模块的功能需要哪几个模块来支撑,当然,这个在基于OSGi的系统更容易来做到,不过这个确实是设计时很关键的一个地方,这既反映了系统中模块的耦合性,更体现了系统的扩展性以及系统的组装耦合上是否合理。
分享到:
相关推荐
1. **模块系统**:OSGi的核心是模块系统,它定义了模块(Bundle)的概念,每个模块都有自己的类路径,并通过导出和导入包来声明对外部的依赖。理解模块化设计原则,包括封装、依赖管理和版本控制,是构建可扩展系统...
5. **调试与监控**:由于OSGi的动态性,调试和监控工具的选择和使用显得尤为重要,以便于快速定位问题。 总之,Java应用架构设计中的模块化模式和OSGi框架提供了构建高效、灵活、可扩展应用的基石。通过充分利用...
总之,通过OSGi和Equinox,我们可以构建一个高度模块化的Java系统,其中GPS和安全气囊服务作为私有服务发布,提高了系统的安全性与灵活性。理解并掌握这一技术,对于构建可扩展、可维护的现代Java应用程序至关重要。
OSGi与Equinox 创建高度模块化的Java系统 This first part of the book introduces OSGi and Equinox, Eclipse’s implementation of the OSGi standard. Chapter 1outlines the history and context of OSGi. Its ...
4. **事件机制**:OSGi提供了事件发布和订阅机制,允许模块间通过事件进行异步通信,增强了系统的响应性和实时性。 三、OSGi框架的应用场景 1. **嵌入式系统**:由于其轻量级和动态性,OSGi常用于嵌入式设备,如...
这些模块化特性有助于创建松散耦合、易于维护和扩展的系统。 2. **Equinox框架**:了解Equinox如何作为OSGi的实现,提供了用于管理OSGi模块的运行时环境。这包括bundle的加载、解析、启动和停止等操作,以及如何...
在OSGi中,模块通过添加元数据来定义哪些类应该被暴露,哪些类应该被隐藏,从而控制了类的可见性和可用性,使得系统达到高内聚和低耦合。 接着,文章提出了一个关键问题:为什么需要模块化?作者详细阐述了OSGi中...
1. **复杂性**:OSGi的模块化和动态性增加了系统的复杂性,需要更精细的规划和设计。 2. **学习曲线**:对于新开发者,理解OSGi的概念和最佳实践可能需要一定时间。 3. **调试与测试**:在OSGi环境中进行调试和测试...
OSGi的模块化特性允许动态加载和卸载模块,使得应用程序更加灵活和可扩展。 4. **GitHub**:GitHub是全球最大的开源代码仓库,开发者可以在这里分享、协作和存储代码。"OSGi.NET"项目在GitHub上的存在意味着它可能...
在Java应用架构设计中,结合模块化模式和OSGi,开发者可以创建高度解耦、可配置和可扩展的系统。例如,通过OSGi,开发者可以将不同功能模块打包成独立的bundle,这些bundle可以根据需求动态地添加到系统中。模块化...
OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...
Equinox是Eclipse基金会提供的一个OSGi实现,它允许开发者创建高度模块化的Java系统,从而提高了软件的可维护性和可扩展性。本章聚焦于OSGi中的Declarative Services(DS),这是一种声明式的服务管理机制,它简化了...
2. 动态性:OSGi环境支持模块的动态安装、启动、停止和卸载,这允许应用程序在运行时进行热更新和配置调整,增强了系统的灵活性和可适应性。 3. 服务注册与发现:OSGi提供了一种服务注册表,允许模块发布和查找服务...
OSGI(Open Services Gateway Initiative)是一种开放标准的Java模块化系统,它允许开发人员将应用程序分解为一组可独立更新和管理的模块。这些模块被称为服务,它们之间通过接口进行交互,使得OSGI环境下的组件化...
它使得开发者可以创建动态化、模块化的Java系统,便于实现应用的解耦合,提高代码的可重用性,并且简化了系统的维护和升级过程。OSGi作为Java世界中一个重要的动态加载技术框架,为Java企业应用的开发提供了一种全新...
OSGi设计思想强调轻量级的封装和模块间的松耦合,实现了高内聚低耦合的架构。在OSGi中,每个模块都封装自己的依赖性,仅对外提供清晰定义的API。 2. 留言板设计与实现 文档中提到的基于OSGi的留言板设计和实现,...
- 微服务架构:讨论如何利用OSGi的模块化特性构建微服务,实现松耦合和独立部署。 - AOP在OSGi中的应用:阐述Spring的面向切面编程(AOP)在OSGi环境下的实现和优势。 - 测试策略:提供针对OSGi应用的测试方法,...
OSGi与Equinox 创建高度模块化的Java系统,分享给所有需要的人
这是因为OSGi的设计初衷是为了满足模块化开发中最为基础的需求,比如清晰地划分模块边界,防止不同模块之间的类冲突等问题。 #### OSGi的核心特性:模块分离 为了实现模块间的有效隔离,OSGi引入了类加载器的概念...
OSGi(Open Service Gateway Initiative)是一种java模块化系统的构建专家,它提供了一个动态化的模块化系统,能够解决传统项目中的类加载器类冲突、jar包依赖性管理、包可见性管理和jar包版本管理等问题。...