我想到了一个智能系统,它可以动态地选择可用的OSGi服务。也就是说,根据某些运行时参数选择一个或另一个实现。例如,通知正在运行的算法,该算法在多次迭代后更改一个操作符,或者取决于系统中的负载平衡或其他什么。
while(stopCriterion){
operator.doSomething(); //There exist many operator implementations
}我的第一种方法是使用DS公开服务,并使用0.n和动态策略绑定服务。然后,从外部的智能组件中,通知在每次迭代中使用哪个服务的算法(可能使用EventAdmin?)。
operator[selected].doSomething();这可以帮助我在必须执行许多不同服务实现的实验时降低复杂性。另外,我计划使用远程服务规范和Eclipse通信框架对分布式算法进行研究,因此在执行时动态地出现新的实现也是可能的。
但是,我不知道这是一个好主意,还是有另一个更好的机制来动态选择使用哪个实现。我认为使用ServiceTracker代替DS并不是一个好的选择,但我愿意接受以下建议:)
提前谢谢。
发布于 2011-04-27 12:41:31
在我看来,这是一种策略模式,可以很好地使用服务来实现。假设您有一个名为Operator的服务类型(并且有一个具有相同名称的接口),这将大致如下所示:
OperatorProvider服务,该服务包含必要的功能和一些附加信息(例如,此实现何时适合),并为每个策略创建多个实例。Operator接口,并将对服务的所有调用传递给最合适的OperatorProvider。该服务选择最合适的提供者的方式,可能是智能的一部分。Operator服务,而不必担心提供者的选择。我假设您可以将选择策略放在选择器服务中,但是如果它确实是一个外部组件,则可以使用任何您喜欢的机制来处理智能组件和选择器之间的通信:服务接口、事件等。
发布于 2011-04-27 12:43:22
我想,某种动态策略模式甚至依赖注入都可以满足您的需要。一些类使用一种策略(您称之为运算符),它可以在运行时更改。我认为,您还有另一个服务,它可以根据运行时参数判断使用哪种策略。
粗略的实现可能如下所示:
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;
}
}
}另一个服务,即可以将依赖项注入到员工实例的服务,将维护所有员工实例的列表,实现一些选择新服务的逻辑,并将其插入到所有(或某些)工作人员中。
https://stackoverflow.com/questions/5804059
复制相似问题