【问题标题】:Looking for an OSGi Design-Pattern寻找 OSGi 设计模式
【发布时间】:2011-08-03 16:16:07
【问题描述】:

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

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

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

最好的问候

【问题讨论】:

    标签: java design-patterns osgi


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我同意你的看法。将这两个方面分开是要走的路。当我谈到“特殊属性”时,您对枚举的建议正是我在对克里斯的评论中的意思。谢谢-你们俩! :)
    • 请注意,如果使用服务排名,您可以只对您的 ServiceReference 对象进行排序。根据 OSGi 规范,这些是根据服务排名进行比较的。
    【解决方案2】:

    一般来说,如果你需要一个特殊的遍历一堆对象的顺序,你只需在你的对象之间定义一个(部分)顺序。 然后,您对拥有的对象进行排序并浏览该列表。

    因此,对于您的问题,当需要某个属性的值时,您会找到所有来源,将它们排序到一个列表中,最后对其进行迭代。

    【讨论】:

    • 好的。所以我可以在源的服务声明中指定一个特殊属性,并根据例如对它们进行排序。一个配置文件。但是我缺少某种编译时检查。如果开发人员拼错了属性值,如果是简单的字符串,则很难调试。
    • 如果你想要编译时检查,你可以在你的服务接口中定义一个返回你排序的属性的方法,或者简单地扩展Comparable接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多