我目前面临的问题是如何根据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)。
目前,我可以看到两种方法来实现这一点:
- 将服务B的所有可用实例绑定到服务A的实例,并根据其id选择适当的服务B
- 为服务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。如果您没有为此属性指定值,则会选择一个随机的服务