7

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

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

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

operator[selected].doSomething();

当必须执行具有许多不同服务实现的许多实验时,这可以帮助我降低复杂性。另外,我计划使用带有Eclipse 通信框架的远程服务规范来研究分布式算法和那些东西,所以在执行时动态出现新的实现也是可能的

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

提前致谢。

4

2 回答 2

5

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

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

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

于 2011-04-27T12:41:31.613 回答
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;
     }
  }
}

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

于 2011-04-27T12:43:22.203 回答