OSGi动态版为一类

时间:2012-08-13 13:06:47

标签: osgi

我有一个OSGi包,其中一个服务类由两个客户端使用。使用相同版本的服务类的客户端都说1.0,现在我已经在服务类中做了一些更改并更新了服务类的版本说1.1,现在我的问题是我想要服务类的两个版本意味着一个客户端可以使用1.0版本和另一个客户端可以使用1.1怎么能实现这个?如果任何样本可以为我提供动态版本控制,那对我来说真的很有帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

我不认为OSGi有一个真正的服务版本概念,但您可以在注册服务时使用您喜欢的任何键/值对。我认为Knopflerfish tutorial非常好。

例如,在注册服务时:

Hashtable props = new Hashtable();
props.put("version", "1.0");
bundleContext.registerService(ServiceInterface.class.getName(), impl, props);

然后,在使用服务时,您可以使用这些属性来要求某些属性。

拥有此服务的多个版本非常简单,棘手的部分是服务消费者如何处理它。

如果您有两个使用版本1.0的消费者,并且出现1.1(例如,当启动新捆绑包时),消费者应该停止使用1.0并开始使用1.1吗?在您的示例中,其中一个消费者应该忽略这一点,而另一个应该重新连接到1.1。当一个消费者消费多种服务时,这会变得特别复杂。

我建议查看声明式服务,它可以使这更容易并保持代码更清洁,我会说start here

答案 1 :(得分:1)

服务的版本是它实现的接口的版本,该版本来自该接口所在的导出包的版本。

服务实现类版本无关紧要,因为服务的使用者不了解实现类。因此,如果您使用相同的界面注册多个服务,则消费者都可以看到它们。