停止在启动时使用Felix Dependency Manager创建的OSGi Bundle

时间:2016-11-09 07:51:01

标签: osgi felix-dependency-manager

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

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

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

实现此要求的正确方法是什么?如果start方法有致命问题,bundle应该保持停止状态?

1 个答案:

答案 0 :(得分:0)

如果您希望某个捆绑包在尝试启动它之后不会变为活动状态,则必须从BundleActivator的start方法中抛出异常。这是告诉框架存在错误并且捆绑无法启动的最佳方式。

您尝试从组件的start方法中抛出异常。那时捆绑已经变得活跃,所以你来不及。

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

  1. 加载并验证您的XML(如果失败则抛出异常)。
  2. 调用超类的start方法,以便DM可以完成其工作。
  3. 这隐含意味着您不能为此捆绑使用基于注释的DM版本,因此如果您使用它,则必须将其转换为使用代码声明其组件和依赖项的捆绑包。