如果声明性服务失败,则启动捆绑包失败

时间:2017-12-17 10:57:51

标签: osgi declarative-services

如果其中一个DS组件无法初始化,是否有办法防止Bundle被标记为“ACTIVE”?

例如,如果我要实现BundleActivator,我可以在BundleException方法中抛出start(),并且该捆绑包不提供任何服务,我可以阻止其注册。

在我的@Activate方法中使用声明式服务如果由于某种原因无法初始化,我可能会抛出异常。我发现虽然这样做并不能阻止捆绑标记为“活动”。我还假设一个组件的故障不会阻止捆绑中的其他组件变为活动状态?

例如,如果我有几个组件且一个组件无法初始化,那么我会想要停用所有其他组件,并且整个软件包不是活动的,即失败快速。

有没有办法用Declarative Services做到这一点?

1 个答案:

答案 0 :(得分:0)

不,这是不可能或不可取的。组件生命周期与bundle生命周期是分开的。当您想要了解其中的组件状态时,您不应该查看捆绑状态。

每个组件的生命周期也是独立的。您可以在一个包中提供多个组件,但这实际上只是为了让它们共享静态(即编译时)依赖性。如果您需要将一个组件的生命周期与另一个组件的生命周期联系起来,则应在它们之间建立服务引用。

如果您在另一个不相关的组件发生故障时解释为什么您希望组件失败,那将会有所帮助。那么也许我们可以为潜在的问题提供更好的解决方案。