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

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

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

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

 operator[selected].doSomething(); 

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

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

提前致谢。

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

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

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

我想,某种动态策略模式甚至dependency injection可以满足您的需求。 某些类使用可在运行时更改的策略(您称之为运算符 )。 我认为,您有另一种服务可以告诉使用哪种策略(基于运行时参数)。

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

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

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