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



我目前面临的问题是如何根据OSGi服务的配置属性动态"连接"OSGi服务。我想用声明服务来做到这一点。

举一个具体的例子:我有两个不同的OSGi服务A和B,它们都是ManagedServiceFactory,需要配置。所以我可以有多个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-two连接/绑定至a-two(取决于它们匹配的配置属性b.id=id)。

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

  1. 服务B的所有可用实例绑定到服务A的实例,并根据其id选择适当的服务B
  2. 为服务A实现自己的ManagedServiceFactory,它创建一个LDAP筛选器来查找服务B的正确实例

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

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

有人知道如何实现这一目标的更好解决方案或"最佳实践"吗?我不确定WireAdmin规范是否能在这里帮助我?

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

tia

干杯Sascha

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

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

举个例子:

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

相关内容

  • 没有找到相关文章

最新更新