【发布时间】:2012-08-13 13:06:46
【问题描述】:
我有一个 OSGi 包,其中一个服务类由两个客户端使用。两个客户端都使用相同版本的服务类说 1.0,现在我对服务类进行了一些更改并更新了服务类的版本说 1.1,现在我的问题是我想要两个服务类的版本意味着一个客户端可以使用1.0版本和另外一个客户端可以用1.1怎么可以实现呢?如果有任何示例可以为我提供动态版本控制,那对我真的很有帮助。
谢谢。
【问题讨论】:
标签: osgi
我有一个 OSGi 包,其中一个服务类由两个客户端使用。两个客户端都使用相同版本的服务类说 1.0,现在我对服务类进行了一些更改并更新了服务类的版本说 1.1,现在我的问题是我想要两个服务类的版本意味着一个客户端可以使用1.0版本和另外一个客户端可以用1.1怎么可以实现呢?如果有任何示例可以为我提供动态版本控制,那对我真的很有帮助。
谢谢。
【问题讨论】:
标签: osgi
服务的版本是它实现的接口的版本,它来自于该接口所在的导出包的版本。
服务实现类版本无关紧要,因为服务的消费者不知道实现类。因此,如果您使用相同的接口注册多个服务,它们都将对消费者可见。
【讨论】:
我认为 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
【讨论】: