在运行时获取声明性服务

时间:2014-03-17 16:13:00

标签: java osgi declarative-services

获取服务的正确方法是什么,希望在可能的情况下使用声明式服务,当您在运行时之前不知道要请求的服务的属性时?

用例类似于提供3个捆绑包提供服务版本1.0,2.0和3.0,但在用户在UI中选择一个捆绑包之前不知道将使用哪个捆绑包。如果用户选择2.0,则消费者将使用来自bundle 2.0的内容

我们正在使用BND注释,所以使用它们是理想的,但我觉得我们需要直接使用OSGi API而不是使用注释或声明性服务注入。

最后,如果它是相关的,那么更多的是获得不同版本的资源(XML模式)而不是不同的行为/实现。这个想法是服务将提供其内部资源,即使服务本身的代码相同,每个版本的内部资源也会不同

2 个答案:

答案 0 :(得分:1)

Declarative Services规范的声明性模型是构建时模型,而不是运行时模型。要进行运行时依赖关系管理,您需要自己使用ServiceTracker,或使用不同的依赖关系管理解决方案。

作为其作者之一,我偏爱Apache Felix依赖管理器[1],它允许您在Java代码中“声明”依赖关系(在运行时,例如基于用户在就像你说的那样)。它不使用Bnd注释,但代码仍然允许你使用声明式样式并提供注入和/或回调等功能。

允许这样做的另一个解决方案是Apache Felix iPOJO [2]。

[1] http://felix.apache.org/documentation/subprojects/apache-felix-dependency-manager.html

[2] http://felix.apache.org/documentation/subprojects/apache-felix-ipojo.html

答案 1 :(得分:1)

之前我曾在类似的系统中工作过,我们有自己的“路由”系统。基本上,当您注册服务时,请在元数据中添加版本号。然后在此路由机制中选择正确的服务。您的服务需要实现一个通用接口,并在路由器中注入List个。