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

时间:2011-04-27 12:25:21

标签: java service osgi declarative

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

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

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

operator[selected].doSomething();

当必须执行许多不同服务实现的许多实验时,这可以帮助我降低复杂性。此外,我计划使用Eclipse Communication Framework远程服务规范来研究分布式算法和那些东西,因此也可以在执行时间内动态显示新实现

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

提前致谢。

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

我想,某种动态策略模式甚至依赖注入可以满足您的需求。某些类使用可在运行时更改的策略(您将其称为 operator )。我想,你有另一个服务可以告诉使用哪个策略(基于运行时参数)。

粗略的实现可能看起来像这样:

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;
     }
  }
}

另一个可以向工作者实例注入依赖关系的服务将维护所有工作者实例的列表,实现一些逻辑来选择新服务并注入所有(或某些)工作者。