在Java框架启动期间更新Apache Felix Bundles

时间:2016-01-26 03:37:07

标签: java osgi apache-felix osgi-bundle

所以我有这个代码,我打电话在启动期间更新Apache Felix Framework中的捆绑包,但我只更新我故意设置为7级或更高级别的捆绑包。每当执行此代码时,都会从列表中删除更新的包,并且控制台会挂起。其他时候,更新后的包的状态为ACTIVE,但控制台也会挂起。

Arrays.stream(bundleContext.getBundles())
            .filter((bundle) ->  return bundle.adapt(BundleStartLevel.class).getStartLevel() > 6;
            .forEach((Bundle bundle) -> {
                try {
                    this.logger.log(LOG_DEBUG, "updating : " + bundle.getSymbolicName());
                    if (bundle.getState() == Bundle.ACTIVE) {
                        bundle.stop();
                    }
                    bundle.update();
                    bundle.start(Bundle.ACTIVE);
                } catch (BundleException exception) {
                    this.logger.log(LOG_ERROR, "Bundle update for " + name + " failed.", exception);
                }
            });

是否有正确的方法来更新Apache Felix Framework

中的包

1 个答案:

答案 0 :(得分:0)

从您给出的描述和代码示例中,无法确切地说出出现了什么问题:

  • 这段代码什么时候被完全调用?
  • 您在说明中只说更新了启动级别为7或更高的捆绑包。我在代码中没有看到任何地方。实际上它只更新具有等于name的符号名称的包。
  • 执行更新时,根本无需调用bundle.stop()bundle.start()。此外,这段代码中的逻辑是有缺陷的:如果一个bundle在它现在变为活动之前没有活动。
  • 如果从BundleActivator的start方法调用此代码,它可能会尝试更新自身,这会导致各种不可预测的行为。