按配置属性

时间:2015-06-23 13:23:13

标签: java osgi bndtools

我目前面临的问题是如何动态地" wire" OSGi服务取决于其配置属性。我想用Declarative Services做到这一点。

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

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

一个-one.cfg: b.id = foo

一个-two.cfg: b.id = bar

B-one.cfg: id = foo

B-two.cfg: id = bar

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

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

  1. 所有服务B的可用实例绑定到服务A的实例,并根据其ID选择正确的服务B.
  2. 为Service A实现一个自己的ManagedServiceFactory,它创建一个LDAP过滤器以查找正确的Service B实例。
  3. 对于解决方案1.)我不喜欢我需要将Service B的所有实例绑定到Service A的每个实例。我只想绑定满足配置属性约束的Service B实例。

    对于解决方案2.)我不喜欢我需要深入到较低级别:拥有ManagedServiceFactory并通过手动查找正确的(LDAP过滤的)服务实例来绕过DS。

    有人知道更好的解决方案或者最佳实践"怎么实现呢? 我不确定WireAdmin规范是否可以帮助我?

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

    TIA

    干杯 的Sascha

1 个答案:

答案 0 :(得分:1)

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

另一方面,如果您使用“.target”后缀为引用指定属性,则可以通过配置指定要提取的服务。

用你的例子:

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