【问题标题】:resolving osgi service with version使用版本解析 osgi 服务
【发布时间】:2012-05-11 10:12:02
【问题描述】:

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

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

定义接口 x.y.z.SomeService 的 bundle-api(版本 1.0.0): 它在版本 1.0.0 中导出 x.y.z

实现 SomeService (v 1.0.0) 的 bundle-impl(版本 1.0.0),在规范版本 1.0.0 中导入包 x.y.z 并注册服务

定义接口x.y.z.SomeService的bundle-api(2.0.0版): 它在 2.0.0 版本中导出 x.y.z

实现 SomeService (v 2.0.0) 的 bundle-impl(版本 2.0.0),在规范版本 2.0.0 中导入包 x.y.z 并注册服务

现在,我有一个客户端 bundle-client(版本 1.0.0),它可以在版本规范 1.0.0 中导入 bundle-api 的 x.y.z。

如何在 1.0.0 版本中获取 x.y.z.SomeService 的服务?

目前,安装/激活时: 捆绑API 1.0.0 捆绑实现 1.0.0 捆绑API 2.0.0 捆绑实现 2.0.0 捆绑客户端 1.0.0

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

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

我应该怎么做?

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

【问题讨论】:

    标签: binding service osgi versioning


    【解决方案1】:

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

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

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

    【讨论】:

    • 尼尔,谢谢您的回复。查询服务的代码如下所示: List > refs = Arrays.asList ( context.getServiceReferences ( SomeService.class.getName (), null));
    • 实际上,当使用getServiceReferences (Class <T> clazz, String filter) 查询时,felix 实现会将其转换为getServiceReferences (clazz.getName (), filter)。事实上,实际上我正在寻找一个接口的实现,但似乎我正在为一个与接口名称匹配的名称获得服务......或者我缺少什么?
    • 一个 OSGi 服务是一个接口实现,由接口名称映射。所以你得到了你正在寻找的东西。
    • @robin 问题是接口是版本化的。即:在版本 1 中,我们有:public interface IMyItf {String getData ();},而在版本 2 中,相同的接口将更改为 public interface IMyItf {String getData (); int getCount ();} 版本 1 中的实现类 MyItf 实现了版本 1 的 IMyItf,并且位于导入IMyItf 包的版本为 1 并标记为版本 1,而捆绑包的更新在 v2 中实现 IMyItf v2,导入版本为 2 的 IMyItf 包
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 2013-06-14
        • 2021-09-13
        • 2017-11-22
        • 2018-08-01
        • 2018-01-10
        • 1970-01-01
        相关资源
        最近更新 更多