首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OSGi实战优势

OSGi实战优势
EN

Stack Overflow用户
提问于 2018-10-10 15:02:21
回答 1查看 73关注 0票数 1

我正在试验OSGi来构建一个模块化的IoT单元。如果你想在不牺牲通信代码的情况下更新系统的一部分(例如传感器代码),这似乎是一项完美的技术,反之亦然。

但问题是:

为什么在更新服务时(在包内)需要重新启动所有依赖的包?

代码语言:javascript
运行
复制
private void updateBundle(String f) {
    BundleContext mainBc = felix.getBundleContext();
    Bundle bundle = mainBc.getBundle(f);
    try {
        bundle.update();
    // if I don't do this, the services inside 'bundle' will NOT be updated
        PackageAdmin pa = mainBc.getService(mainBc.getServiceReference(PackageAdmin.class));
        pa.refreshPackages(mainBc.getBundles());
    // at this point all bundles were restarted
    } catch (BundleException e) {
        System.err.println("Error while updating  " + f);
        e.printStackTrace();
    }
}

从我的所有包都重新启动(或者至少是依赖的包)判断,更新包中的类定义有什么意义,因为所有的应用程序包都将是stoppedstarted重置所有状态和活动连接?

这就像从命令行重新启动我的应用程序一样,那么为什么我需要osgi呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-10 17:31:51

似乎包含服务接口类的包是由服务实现包导出的。因此,当服务实现包被更新时,导出的包也是如此。因此,所有使用该服务的包都使用导出包的旧版本,这与您的服务实现包不同。因此,您必须刷新所有这些服务消费包,以确保它们使用与服务实现包相同的导出包修订版。

这就是为什么您希望从与服务实现包不同的包导出包含服务接口类的包。然后,所有服务消费包和服务实现包从导出包中导入。然后,在更新服务实现包时,不需要刷新服务消费包。

因此,通常,您不希望经常更新的包导出包,这些包必须由关心更新包(例如服务)功能的其他包导入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52743222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档