我目前在 OSGi 应用程序中遇到一个有趣的问题。
我正在实现一个配置服务,该服务应该从多个源(文件、注册表或网络)检索应用程序的配置。配置服务应该以特殊顺序从源中读取,直到获得配置属性的值。
首先我想到将每个源放在一个单独的包中,为它们创建一个 super 接口(interface)并让它们提供声明性服务。这也将有助于模块化所需的注册表,因为它并非在每个操作系统上都可用。当配置服务被要求提供属性值时,它会根据白板模式查询所有源包并读取配置,直到获得非空值。但它以随机顺序执行。
有人知道如何在遍历提供配置服务的包时实现特殊顺序吗?
致以诚挚的问候
最佳答案
OSGi已经有了服务排名的概念。注册服务时,您可以为属性“service.ranking”(org.osgi.framework.Constants.SERVICE_RANKING)提供一个值。
我认为此属性对 BundleContext#getServiceReferences() 返回可用服务引用的顺序没有任何影响(至少规范没有说明任何相关内容),但您仍然可以使用该属性值订购由您的“ super ”配置服务管理的内部集合。
但是,对我来说,让服务实现本身决定其相对重要性通常是一个奇怪的想法。我宁愿把问题分成两部分。
- 作为外观的配置服务
- 配置源提供程序的集合
第二个接口(interface)将包含一些特征概念(例如枚举{file,registry,net}
)。然后,我将让第一个接口(interface)(外观)的实现根据每个提供者的特征执行排序(正如 Chris 的第一个答案已经暗示的那样)。
关于java - 寻找 OSGi 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6929702/