【问题标题】:Stopping an OSGi Bundle created using Felix Dependency Manager at startup time在启动时停止使用 Felix Dependency Manager 创建的 OSGi Bundle
【发布时间】:2016-11-09 07:51:01
【问题描述】:

我们使用 Felix 作为我们的 OSGi 框架和 Felix 依赖管理器来管理我们的 OSGi 组件。我们有一种情况,我们在组件的 start 方法中加载和验证 XML。如果针对模式的 XML 验证失败,我们希望停止捆绑。我们有

  • 尝试在 start 方法中抛出异常,但 bundle 仍然处于活动状态
  • 在 start 方法中调用了 Bundle 的 stop 方法,但这会将 bundle 设置为不稳定(停止)状态。

                FrameworkUtil.getBundle(this.getClass()).stop();
    

如果启动方法存在致命问题,捆绑包应该保持停止状态,那么实现此要求的正确方法是什么?

【问题讨论】:

    标签: osgi felix-dependency-manager


    【解决方案1】:

    如果您希望某个包在有人尝试启动它后不被激活,您必须从 BundleActivator 的start 方法中抛出一个异常。这是告诉框架出现问题并且您的包无法启动的最佳方式。

    您尝试从组件的start 方法中抛出异常。此时捆绑包已经激活,所以你来不及了。

    在这种情况下,我建议您从 DependencyActivatorBase 覆盖 start 方法,并且:

    1. 加载并验证您的 XML(如果失败则抛出异常)。
    2. 调用超类的start 方法,这样DM 就可以工作了。

    这隐含意味着您不能为此捆绑使用基于注释的 DM 版本,因此如果您使用它,则必须将其转换为使用代码声明其组件和依赖项的捆绑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 2016-03-08
      • 2013-10-28
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多