我正在试验OSGi来构建一个模块化的IoT单元。如果你想在不牺牲通信代码的情况下更新系统的一部分(例如传感器代码),这似乎是一项完美的技术,反之亦然。
但问题是:
为什么在更新服务时(在包内)需要重新启动所有依赖的包?
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();
}
}
从我的所有包都重新启动(或者至少是依赖的包)判断,更新包中的类定义有什么意义,因为所有的应用程序包都将是stopped
和started
重置所有状态和活动连接?
这就像从命令行重新启动我的应用程序一样,那么为什么我需要osgi呢?
发布于 2018-10-10 17:31:51
似乎包含服务接口类的包是由服务实现包导出的。因此,当服务实现包被更新时,导出的包也是如此。因此,所有使用该服务的包都使用导出包的旧版本,这与您的服务实现包不同。因此,您必须刷新所有这些服务消费包,以确保它们使用与服务实现包相同的导出包修订版。
这就是为什么您希望从与服务实现包不同的包导出包含服务接口类的包。然后,所有服务消费包和服务实现包从导出包中导入。然后,在更新服务实现包时,不需要刷新服务消费包。
因此,通常,您不希望经常更新的包导出包,这些包必须由关心更新包(例如服务)功能的其他包导入。
https://stackoverflow.com/questions/52743222
复制相似问题