通过配置属性动态连接 OSGi 服务
Dynamically wire OSGi Services by configuration properties
我目前面临如何根据其配置属性动态 "wire" 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 = 栏
现在我想 wire/bind 服务 b-one 到 a-one 和服务 b-two 到 a-two(取决于它们匹配的配置属性 b.id = id)。
目前我可以看到两种实现此目的的方法:
- 将服务 B 的 所有 个可用实例绑定到服务 A 的实例,并根据其 ID select 正确的服务 B。
- 为服务 A 实现一个自己的 ManagedServiceFactory,它创建一个 LDAP 过滤器来找到服务 B 的正确实例。
对于解决方案 1.) 我不喜欢我需要将服务 B 的所有实例绑定到服务 A 的每个实例。我喜欢只绑定满足我的配置的服务 B 实例 属性约束。
对于解决方案 2。)我不喜欢这样,我需要挖掘到较低的层次:拥有 ManagedServiceFactory 并通过手动找到合适的(LDAP 过滤的)服务实例来绕过 DS。
有谁知道更好的解决方案或 "best practice" 如何实现?
我不确定 WireAdmin 规范是否可以帮助我?
带有 BNDTools/BND 注释的解决方案将受到欢迎 ;)
蒂亚
干杯
萨沙
如果 DS 为组件注册服务,它总是将所有配置信息作为服务属性。您应该在 A 和 B ManagedServiceFactory 中执行相同的操作,以便可以搜索服务。
另一方面,如果您使用“.target”后缀指定 属性 作为参考,您可以通过配置指定要获取的服务。
以你为例:
- 您为 B
创建了一个组件
- 您在组件 B 中为服务 A 指定了名称为 a[ 的引用=30=]
- 您在组件 B 中指定了一个名为 a.target
的 属性
- 您使用 LDAP 搜索过滤器配置 a.target。如果您没有为此 属性 指定值,将选择随机 A 服务
我目前面临如何根据其配置属性动态 "wire" 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 = 栏
现在我想 wire/bind 服务 b-one 到 a-one 和服务 b-two 到 a-two(取决于它们匹配的配置属性 b.id = id)。
目前我可以看到两种实现此目的的方法:
- 将服务 B 的 所有 个可用实例绑定到服务 A 的实例,并根据其 ID select 正确的服务 B。
- 为服务 A 实现一个自己的 ManagedServiceFactory,它创建一个 LDAP 过滤器来找到服务 B 的正确实例。
对于解决方案 1.) 我不喜欢我需要将服务 B 的所有实例绑定到服务 A 的每个实例。我喜欢只绑定满足我的配置的服务 B 实例 属性约束。
对于解决方案 2。)我不喜欢这样,我需要挖掘到较低的层次:拥有 ManagedServiceFactory 并通过手动找到合适的(LDAP 过滤的)服务实例来绕过 DS。
有谁知道更好的解决方案或 "best practice" 如何实现? 我不确定 WireAdmin 规范是否可以帮助我?
带有 BNDTools/BND 注释的解决方案将受到欢迎 ;)
蒂亚
干杯 萨沙
如果 DS 为组件注册服务,它总是将所有配置信息作为服务属性。您应该在 A 和 B ManagedServiceFactory 中执行相同的操作,以便可以搜索服务。
另一方面,如果您使用“.target”后缀指定 属性 作为参考,您可以通过配置指定要获取的服务。
以你为例:
- 您为 B 创建了一个组件
- 您在组件 B 中为服务 A 指定了名称为 a[ 的引用=30=]
- 您在组件 B 中指定了一个名为 a.target 的 属性
- 您使用 LDAP 搜索过滤器配置 a.target。如果您没有为此 属性 指定值,将选择随机 A 服务