使用不同的启动级别来管理 OSGi 包之间的依赖关系是不是合理?

Posted

技术标签:

【中文标题】使用不同的启动级别来管理 OSGi 包之间的依赖关系是不是合理?【英文标题】:Is it reasonable to use different Start Levels to manage the dependencies between OSGi bundles?使用不同的启动级别来管理 OSGi 包之间的依赖关系是否合理? 【发布时间】:2011-09-26 20:50:29 【问题描述】:

我的团队正在尝试开发一个基于 OSGi 的新系统,现在我们有 50 多个捆绑包并且还在增加。问题是,捆绑包之间存在依赖关系。例如,当bundle A启动时,它将向OSGi注册一个服务,而当bundle B启动时,它将使用该服务。因此,我需要在 bundle B 之前启动 bundle A。为此,我将 bundle A 的启动级别设置为低于 bundle B。

我们尝试使用 ServiceTracker 来避免设置启动级别,但是随着服务数量的增长,管理和理解整个系统变得困难。

但是,我在互联网上找到了这篇文章:OSGi and Start Levels。我不确定里面有两句话:

开始级别内的开始顺序不确定! 总的来说,在使用启动级别时,永远不要依赖启动顺序。将启动级别视为管理问题,而不是开发时间问题。

是不是说启动级别不会决定启动顺序?那应该什么时候用呢?

使用不同的启动级别来管理 OSGi 包之间的依赖关系是否合理?

可以将所有的bundle做成一个动态模块(使用ServiceTracker来跟踪它使用的所有服务),但是这需要更多的时间和需要高级开发人员,并且系统变得难以调试。

【问题讨论】:

【参考方案1】:

我的回答与 Bertrand 类似:您应该考虑为您的解决方案使用更高级别的基于组件的抽象:SCR、iPOJO、Blueprint 等。

使用启动级别来控制依赖关系有点像在 Java 中使用线程优先级来修复竞争条件。当然,你可能会在一段时间内让事情顺利进行,但在这个过程中你会发疯——而且你最终还是会输。

开始级别有用的。典型示例是,如果您需要在启动基于 OSGi 的 GUI 应用程序时显示启动屏幕,方法是将其代码放在一个包中。如果没有起始关卡,则无法确保初始屏幕最终会在应有的时候显示,但使用起始关卡就变得微不足道了。

也就是说,我已经使用启动级别来解决在第三方包(例如 Spring)中发现的依赖排序错误,尽管这不涉及服务排序,而是关于查找资源的假设(使用 Spring,一个 XSD 用于Spring Integration 自定义命名空间)。

【讨论】:

我的团队使用起始级别来解决类似问题。这是找出问题的好方法,如果您没有时间立即解决根本问题,它也是一种有用的短期解决方案。 +1 到 rsteele 的回答。取决于开始订购引入了极端的脆弱性。启动级别的另一个用例是优化。你的包应该总是WORK,无论它们以什么顺序开始......但是有时一个包可能需要根据它的开始顺序做更多或更少的工作。因此,您可以使用启动级别来优化应用的性能,而不要依赖它们来实现实际功能。 谢谢尼尔。我没有考虑效率问题,但它很有意义。【参考方案2】:

使用启动级别来管理服务之间的依赖关系是一个坏主意 - 服务组件运行时 (SCR) 是一种更好的管理方式,如果做得好,它将处理所有依赖关系、启动顺序、重新启动组件时他们需要的服务被重新启动,等等。

如果您使用的是 Maven,Apache Felix SCR 插件 (http://felix.apache.org/site/scr-annotations.html) 只需使用几个 Java 注释即可轻松创建 SCR 托管服务。 Apache Sling 的代码 (http://sling.apache.org) 充满了使用它的示例。

【讨论】:

我们没有使用 Maven,我们使用的是 equinox 而不是 felix。还有什么建议吗? 就 SCR 而言,Equinox 应该没有什么区别,如果你不使用 Maven,你可以直接使用 Bnd (aqute.biz/Bnd/Bnd)——这就是我提到的 Maven 插件在引擎盖。【参考方案3】:

关于启动级别/依赖关系问题的一个很好的总结,解释了为什么您必须避免在具有启动级别的包之间定义依赖关系。

http://wiki.osgi.org/wiki/Avoid_Start_Order_Dependencies

【讨论】:

以上是关于使用不同的启动级别来管理 OSGi 包之间的依赖关系是不是合理?的主要内容,如果未能解决你的问题,请参考以下文章

OSGi - 相互依赖的捆绑包

如何管理 OSGi 构建依赖项?

从 OSGi 包访问命令行参数

OSGI依赖问题处理

如何分析 OSGi 部署的执行?

在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?