我有 OSGi 包,其中一个服务类由两个客户端使用。两个客户端都使用相同版本的服务类说 1.0,现在我对服务类进行了一些更改并更新了服务类的版本说 1.1,现在我的问题是我想要两个服务类的版本意味着一个客户端可以使用1.0版本和另外一个客户端可以用1.1怎么能实现呢?如果任何示例可以为我提供动态版本控制,它对我真的很有帮助。
谢谢。
我有 OSGi 包,其中一个服务类由两个客户端使用。两个客户端都使用相同版本的服务类说 1.0,现在我对服务类进行了一些更改并更新了服务类的版本说 1.1,现在我的问题是我想要两个服务类的版本意味着一个客户端可以使用1.0版本和另外一个客户端可以用1.1怎么能实现呢?如果任何示例可以为我提供动态版本控制,它对我真的很有帮助。
谢谢。
我认为 OSGi 没有真正的服务版本概念,但您可以在注册服务时使用任何您喜欢的键/值对。我认为Knopflerfish 教程非常好。
例如,注册服务时:
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。当一个消费者使用多项服务时,这会变得特别复杂。
我建议研究声明式服务,它可以使这变得更容易并保持你的代码更干净,我会说从这里开始
服务的版本是它实现的接口的版本,它来自该接口所在的导出包的版本。
服务实现类版本无关紧要,因为服务的消费者不知道实现类。因此,如果您使用相同的接口注册多个服务,它们对消费者都是可见的。