我目前在OSGi应用程序中遇到了一个有趣的问题 我正在实现一个配置服务,它应该从多个源(文件,注册表或网络)检索应用程序的配置。配置服务应以特殊顺序从源读取,直到获得配置属性的值。
首先,我想到将每个源放在一个单独的包中,为它们创建一个超级接口,并让它们提供声明性服务。这也有助于模块化所需的注册表,因为它不适用于每个操作系统。当要求配置服务获取属性的值时,它会根据白板模式查询所有源包,并读取配置,直到获得非空值。但它是以随机顺序完成的。
有没有人知道如何在遍历提供配置服务的bundle中实现特殊订单?
祝你好运
答案 0 :(得分:1)
通常,如果您需要为一堆对象进行特殊的遍历顺序,则只需在对象之间定义(部分)顺序。 然后,您对已经获得的对象进行排序并浏览该列表。
因此,对于您的问题,当需要属性值时,您会找到所有源,您在列表中对它们进行排序,最后迭代它。
答案 1 :(得分:1)
OSGi已经有了服务排名的概念。注册服务时,您可以为属性“service.ranking”(org.osgi.framework.Constants.SERVICE_RANKING)提供值。
我认为这个属性对BundleContext#getServiceReferences()返回可用服务引用的顺序没有任何影响(至少规范没有说明任何内容),但你仍然可以使用属性值订购由“超级”配置服务管理的内部集合。
然而,对我而言,让服务实现本身确定其相对重要性通常是一个奇怪的想法。我宁愿将问题分成两部分。
第二个界面将包括一些表征概念(例如enum {file, registry, net}
)。然后,我将根据每个提供者的特征执行第一个接口(外观)执行排序(正如Chris已经建议的第一个答案)。