java - 如何在运行时以智能方式在多个 OSGi 服务中进行选择?

标签 java service osgi declarative

我想到了一个智能系统,它可以动态地在可用的 OSGi 服务中进行选择。也就是说,根据某些运行时参数选择一个或另一个实现。例如,通知正在运行的算法,该算法在几次迭代后更改运算符,或者取决于系统中的负载平衡或其他。

while(stopCriterion){
    operator.doSomething(); //There exist many operator implementations
}

我的第一种方法是使用 DS 公开服务并使用 0..n 和动态 策略绑定(bind)服务。然后,从外部智能 组件,通知算法在每次迭代中使用哪个服务(也许使用 EventAdmin?)。

operator[selected].doSomething();

当必须执行大量不同服务实现的许多实验时,这可以帮助我降低复杂性。此外,我计划将远程服务规范与 Eclipse Communication Framework 一起使用研究分布式算法之类的东西,因此在执行时动态出现新的实现也是可能的

但是,我不知道这是个好主意还是存在另一种更好的机制来动态选择使用哪个实现。我认为使用 ServiceTracker 代替 DS 不是一个好的选择,但我愿意接受建议 :)

提前致谢。

最佳答案

在我看来,这就像一种策略模式,可以很好地使用服务来实现。假设您有一种名为 Operator 的服务(并且有一个同名的接口(interface)),它的工作方式大致如下:

  • 创建一个 OperatorProvider 服务,其中包含必要的功能和一些附加信息(例如,此实现何时适用),并创建多个实例,每个实例一个策略。
  • 创建一个实现 Operator 接口(interface)的选择器服务,并将对该服务的所有调用引导至最合适的 OperatorProvider。该服务选择最合适的提供商的方式可能是智能的一部分。
  • 服务的实际用户现在只依赖于 Operator 服务,而不必担心提供者的选择。

我假设你可以将选择策略放在选择器服务中,但如果它真的是一个外部组件,你可以使用任何你喜欢的机制来处理智能组件和选择器之间的通信:服务接口(interface)、事件、等等

关于java - 如何在运行时以智能方式在多个 OSGi 服务中进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5804059/

相关文章:

java - 广播类未接收到 BOOT_COMPLETED 的广播 Intent

java - 将 JSON 转换为 POJO

java - 将行与左括号和右括号对齐

node.js - NestJS:依赖注入(inject)和提供者注册

java - Apache Felix OSGi 错误 : missing requirement osgi. 扩展程序

java - 尝试打印邮件消息时出现 NullPointerException

hadoop - 如何更改访问hadoop服务的权限?

java - Android Lollipop 中的服务似乎随机消失,没有错误

java - 在 Karaf 的 JAX-RS 包上使用 Spring Security

java - 使用bnd工具生成MANIFEST文件