1

我目前正在评估 osgi(使用 felix 4.3 实现)来管理服务的版本控制。

我一直在创建以下捆绑包:

定义接口 xyzSomeService 的 bundle-api(版本 1.0.0):它在版本 1.0.0 中导出 xyz

实现 SomeService (v 1.0.0)、在规范版本 1.0.0 中导入包 xyz 并注册服务的 bundle-impl (版本 1.0.0)

定义接口 xyzSomeService 的 bundle-api(2.0.0 版):它在 2.0.0 版中导出 xyz

实现 SomeService (v 2.0.0)、在规范版本 2.0.0 中导入包 xyz 并注册服务的 bundle-impl (版本 2.0.0)

现在,我有一个客户端,bundle-client(版本 1.0.0),它在版本规范 1.0.0 中导入 bundle-api 的 xyz。

如何在 1.0.0 版中获得 xyzSomeService 的服务?

目前,安装/激活时: bundle-api 1.0.0 bundle-impl 1.0.0 bundle-api 2.0.0 bundle-impl 2.0.0 bundle-client 1.0.0

当启动 bundle-client 时,它会查询可用的 xyySomeService。我得到了可用服务的答案:bundle-impl 1.0.0 和 bundle-impl 2.0.0

我只想获得与 1.0.0 版匹配的服务实现。

我应该如何进行?

ps:目前,我将 null 设置为过滤器值。

4

3 回答 3

5

您使用什么代码或机制来查询服务?OSGi 自动提供服务兼容性过滤,这意味着如果您的客户端导入 API 的 1.0 版本,那么它只会看到实现 1.0 版本的服务,如果您的客户端导入 API 的 2.0 版本,那么它只会看到实现 2.0 版本的服务.... ETC。

但是有一个方法调用getAllServiceReferences()会显式关闭这个兼容性检查,并且可以用来获取所有版本的所有服务。在 99% 的情况下,这不是您想要做的。如果您使用过,请getAllServiceReferences()尝试更改为getServiceReferences().

如果您正在以其他方式查找服务,那么我需要更多详细信息来进一步帮助您。

于 2012-05-02T00:44:55.267 回答
0

您可以做的是使用诸如 version=1.0.0 和 version=2.0.0 之类的属性发布服务。然后您可以使用 (version=1.0.0) 过滤服务。

我不知道服务应该被 Neil 提到的包版本过滤。由于尼尔确实是该领域的专家,我相信他是对的。那么也许 felix 实现中存在错误?

于 2012-05-21T12:52:35.123 回答
0

服务由其接口的 Java 包进行版本控制。如果您根据 OSGi 语义版本控制模型正确地对该包进行版本控制并执行相应的包导入,那么 OSGi 框架将自动为您进行选择。所有 OSGi 服务都以这种方式进行版本控制。

手动维护它就像手动将你的 java 代码编译为字节码,有一些工具可以做到这一点。bnd(tools) 具有广泛的支持,可以最大限度地减少对这些版本的处理和验证。

OSGi 的整体理念是您只接触到兼容的包。

于 2013-05-03T07:26:23.307 回答