首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时以智能方式在多个OSGi服务中进行选择?

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

Stack Overflow用户
提问于 2011-04-27 12:25:21
回答 2查看 1.6K关注 0票数 7

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

代码语言:javascript
复制
while(stopCriterion){
    operator.doSomething(); //There exist many operator implementations
}

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

代码语言:javascript
复制
operator[selected].doSomething();

这可以帮助我在必须执行许多不同服务实现的实验时降低复杂性。另外,我计划使用远程服务规范和Eclipse通信框架对分布式算法进行研究,因此在执行时动态地出现新的实现也是可能的。

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-27 12:41:31

在我看来,这是一种策略模式,可以很好地使用服务来实现。假设您有一个名为Operator的服务类型(并且有一个具有相同名称的接口),这将大致如下所示:

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

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

票数 5
EN

Stack Overflow用户

发布于 2011-04-27 12:43:22

我想,某种动态策略模式甚至依赖注入都可以满足您的需要。一些类使用一种策略(您称之为运算符),它可以在运行时更改。我认为,您还有另一个服务,它可以根据运行时参数判断使用哪种策略。

粗略的实现可能如下所示:

代码语言:javascript
复制
public Worker {
  private Operator operator;    // your actual operator strategy
  public void setOperator(Operator actualOperator) {
    this.operator = operator;
  }

  public doSomething() {

     while(stopCriterion) {
       Operator operatorForThisIteration = operator;  // pick the injected service
       operatorForThisIteration.doSomething;
     }
  }
}

另一个服务,即可以将依赖项注入到员工实例的服务,将维护所有员工实例的列表,实现一些选择新服务的逻辑,并将其插入到所有(或某些)工作人员中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5804059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档