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

标签 java osgi bndtools

我目前面临一个问题,即如何根据配置属性动态“连接”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 连接/绑定(bind)到 a-one 并将服务 b-two 连接到 a-two(取决于它们匹配的配置属性 b.id = id)。

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

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

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

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

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

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

蒂亚

干杯 萨沙

最佳答案

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

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

以你的例子:

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

关于java - 通过配置属性动态连接 OSGi 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31004012/

相关文章:

java - 配置 OSGI Enroute REST 应用程序以允许异步请求

java - 无法使用 bndtools 插件运行简单的 osgi 应用程序

osgi - 如何使用 bnd-maven-plugin 嵌入 maven 依赖项

java - 将 KeyListner 添加到 robot.mousePress 和 mouseRelease

java - 使用反射传递 Double 类型的参数

java - 使用 volatile 关键字创建一个实例

java - 如何以编程方式查询 p2 存储库中的信息和工件?

java - 如何在 apache felix 上实现异步处理?

java - 用于查找可在拨号盘上用电话号码拼写的所有可能单词的逻辑

java - 复杂的 cron 表达式来运行quartz作业?