在启动时停止使用 Felix Dependency Manager 创建的 OSGi Bundle
Stopping an OSGi Bundle created using Felix Dependency Manager at startup time
我们使用 Felix 作为我们的 OSGi 框架,并使用 Felix Dependency Manager 来管理我们的 OSGi 组件。我们有一种情况,我们在组件的启动方法中加载并验证 XML。如果 XML 对架构的验证失败,我们想停止捆绑。我们有
- 试图在启动方法中抛出异常,但包仍然处于活动状态
在 start 方法中调用了 Bundle 的停止方法,但这会将 bundle 设置为不稳定(停止)状态。
FrameworkUtil.getBundle(this.getClass()).stop();
达到这个要求的正确方法是什么,即如果启动方法有致命问题,bundle 应该保持停止状态?
如果您希望某个包在有人尝试启动后不激活,您必须从 BundleActivator 的 start
方法中抛出异常。这是告诉框架出现问题并且您的包无法启动的最佳方式。
您尝试从组件的 start
方法中抛出异常。那时捆绑包已经激活,所以你来不及了。
在这种情况下,我建议您重写 DependencyActivatorBase
中的 start
方法,并且:
- 加载并验证您的 XML(如果失败则抛出异常)。
- 调用超类的
start
方法,让DM完成它的工作。
这隐含地意味着您不能为此包使用基于注解的 DM 版本,因此如果您正在使用它,则必须将其转换为使用代码声明其组件和依赖项的包。
我们使用 Felix 作为我们的 OSGi 框架,并使用 Felix Dependency Manager 来管理我们的 OSGi 组件。我们有一种情况,我们在组件的启动方法中加载并验证 XML。如果 XML 对架构的验证失败,我们想停止捆绑。我们有
- 试图在启动方法中抛出异常,但包仍然处于活动状态
在 start 方法中调用了 Bundle 的停止方法,但这会将 bundle 设置为不稳定(停止)状态。
FrameworkUtil.getBundle(this.getClass()).stop();
达到这个要求的正确方法是什么,即如果启动方法有致命问题,bundle 应该保持停止状态?
如果您希望某个包在有人尝试启动后不激活,您必须从 BundleActivator 的 start
方法中抛出异常。这是告诉框架出现问题并且您的包无法启动的最佳方式。
您尝试从组件的 start
方法中抛出异常。那时捆绑包已经激活,所以你来不及了。
在这种情况下,我建议您重写 DependencyActivatorBase
中的 start
方法,并且:
- 加载并验证您的 XML(如果失败则抛出异常)。
- 调用超类的
start
方法,让DM完成它的工作。
这隐含地意味着您不能为此包使用基于注解的 DM 版本,因此如果您正在使用它,则必须将其转换为使用代码声明其组件和依赖项的包。