java - 寻找 OSGi 设计模式

标签 java design-patterns osgi

我目前在 OSGi 应用程序中遇到一个有趣的问题。
我正在实现一个配置服务,该服务应该从多个源(文件、注册表或网络)检索应用程序的配置。配置服务应该以特殊顺序从源中读取,直到获得配置属性的值。

首先我想到将每个源放在一个单独的包中,为它们创建一个 super 接口(interface)并让它们提供声明性服务。这也将有助于模块化所需的注册表,因为它并非在每个操作系统上都可用。当配置服务被要求提供属性值时,它会根据白板模式查询所有源包并读取配置,直到获得非空值。但它以随机顺序执行。

有人知道如何在遍历提供配置服务的包时实现特殊顺序吗?

致以诚挚的问候

最佳答案

OSGi已经有了服务排名的概念。注册服务时,您可以为属性“service.ranking”(org.osgi.framework.Constants.SERVICE_RANKING)提供一个值。

我认为此属性对 BundleContext#getServiceReferences() 返回可用服务引用的顺序没有任何影响(至少规范没有说明任何相关内容),但您仍然可以使用该属性值订购由您的“ super ”配置服务管理的内部集合。

但是,对我来说,让服务实现本身决定其相对重要性通常是一个奇怪的想法。我宁愿把问题分成两部分。

  1. 作为外观的配置服务
  2. 配置源提供程序的集合

第二个接口(interface)将包含一些特征概念(例如枚举{file,registry,net})。然后,我将让第一个接口(interface)(外观)的实现根据每个提供者的特征执行排序(正如 Chris 的第一个答案已经暗示的那样)。

关于java - 寻找 OSGi 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6929702/

相关文章:

java - 王牌 :chart how to set xAxis tick with AxisType:DATE

asp.net-mvc - 页面 Controller 模式到底是什么?

c - 什么数字符合这个 C 模式?

java - OSGi:Import-Package/Export-Package 和Require-Capability/Provide Capability 有什么区别?

java - 在 "mvn install"期间显示一个警告

java - 如何避免在括号中用逗号拆分?

java - 在单个 Spring 应用程序上下文中具有不同凭据的相同 Web 服务端口类型?

c++ - 从状态图框架中删除依赖项

osgi - 无法启动片段包 : initial@reference:file:com. springsource.org.apache.jasper-6.0.18.jar

java - 如何删除特定对象?