通过配置属性动态连接 OSGi 服务

Posted

技术标签:

【中文标题】通过配置属性动态连接 OSGi 服务【英文标题】:Dynamically wire OSGi Services by configuration properties 【发布时间】:2015-09-09 07:47:49 【问题描述】:

我目前面临一个问题,即如何根据 OSGi 服务的配置属性动态“连接”它们。我想通过声明式服务做到这一点。

举个具体的例子: 我有两个不同的 OSGi 服务 A 和 B,它们都是 ManagedServiceFactories 并且需要配置。所以我可以有多个 A 实例和多个 B 实例,每个实例都有单独的配置。

我使用 Felix FileInstall、DS/SCR 和 BNDTools,我的配置看起来像这样(简化):

a-one.cfg: b.id = foo

a-two.cfg: b.id = 条形

b-one.cfg: id = foo

b-two.cfg: id = 条形

现在我想将服务 b-one 连接/绑定到 a-one,将服务 b-2 连接到 a-2(取决于它们匹配的配置属性 b.id = id)。

目前我可以看到两种方法来实现这一点:

    将服务 B 的所有个可用实例绑定到服务 A 的实例,并根据其 ID 选择合适的服务 B。 为服务 A 实现一个自己的 ManagedServiceFactory,它创建一个 LDAP 过滤器来查找服务 B 的正确实例。

对于解决方案 1.) 我不喜欢我需要将服务 B 的所有实例绑定到服务 A 的每个实例。我喜欢只绑定满足我的配置属性约束的服务 B 的实例。

对于解决方案 2。)我不喜欢这样,我需要深入挖掘:拥有 ManagedServiceFactory 并通过手动查找正确的(LDAP 过滤)服务实例绕过 DS。

有谁知道更好的解决方案或“最佳实践”如何实现? 我不确定 WireAdmin 规范是否可以帮助我?

欢迎使用 BNDTools/BND 注释的解决方案 ;)

tia

干杯 萨沙

【问题讨论】:

【参考方案1】:

如果为组件注册服务,DS 总是将所有配置信息作为服务属性。您应该在 A 和 B ManagedServiceFactory 中执行相同的操作,以便可以搜索服务。

另一方面,如果您使用“.target”后缀指定一个属性供您参考,您可以通过配置指定要选择的服务。

用你的例子:

您为 B 创建了一个组件 您在组件 B 中为名为 a 的服务 A 指定了一个引用 您在组件 B 中指定了一个名为 a.target 的属性 您使用 LDAP 搜索过滤器配置 a.target。如果你没有为这个属性指定一个值,一个随机的A服务会被选中

【讨论】:

嗨 Balazs,非常感谢您的详细回答。这正是我搜索的内容。我知道这一定是一个常见的用例,并且一定有比我上面列出的两个更好、更简单的解决方案。我刚刚建立了一个包含两个组件的 POC 项目,您是对的:“a.target = (id=one)”成功了。我不知道这个“.target”扩展名(不知道谷歌搜索很难;))。着迷于使用 OSGi 是多么容易......这真是令人兴奋;) 如果有人无法让它工作,我在这里分享了我的 POC(它使用了 BND 注释):github.com/shomeier/bnd_poc

以上是关于通过配置属性动态连接 OSGi 服务的主要内容,如果未能解决你的问题,请参考以下文章

OSGi 的核心配置动态化及问题

OSGI

在 OSGi 中配置 Restlet 以使用 Jetty 连接器(非简单连接器)

OSGI 面向Java的动态模型系统

Java动态模型系统OSGi实战讲解

SCR(ServiceMix)没有拾取OSGI组件?