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

Dependencies 使用不同的启动级别来管理OSGi捆绑包之间的依赖关系是否合理?,dependencies,osgi,bundle,Dependencies,Osgi,Bundle,我的团队正在尝试开发一个基于OSGi的新系统,现在我们有50多个捆绑包。问题是,捆绑包之间存在依赖关系。例如,当bundle A启动时,它将向OSGi注册一个服务,当bundle B启动时,它将使用该服务。因此,我需要在bundle B之前启动bundle A。为了实现这一点,我将bundle A的启动级别设置为小于bundle B 我们试图使用ServiceTracker来避免设置启动级别,但当服务逐渐增多时,就很难管理和理解整个系统 但是,我在互联网上找到了这篇文章:。我不确定其中有两句话:

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

我们试图使用ServiceTracker来避免设置启动级别,但当服务逐渐增多时,就很难管理和理解整个系统

但是,我在互联网上找到了这篇文章:。我不确定其中有两句话:

  • 起始级别内的起始顺序不确定
  • 总的来说,在使用启动级别时,永远不要依赖于启动顺序。将启动级别视为一个管理问题,而不是开发时间问题
这是否意味着启动级别不会决定启动顺序?那我什么时候用呢

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


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

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


如果您使用的是Maven,ApacheFelixSCR插件()可以轻松地使用少量Java注释创建SCR托管服务。Apache Sulle的代码()使用了这个例子。

< P>我的答案类似于贝特朗:您应该考虑使用更高级的基于组件的抽象来解决:SCR、IPOJO、蓝图等。 使用开始级别来控制依赖关系有点像在Java中使用线程优先级来修复争用条件。当然,你可能会让事情运作一段时间,但在这个过程中你会变得疯狂——最终你还是会输

启动级别很有用。典型的例子是,如果您需要在启动基于OSGi的GUI应用程序时显示启动屏幕,请将其代码放入捆绑包中。如果没有开始级别,就无法确保启动屏幕在应该显示的时候显示出来,但使用开始级别则变得微不足道


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

这是关于开始级别/依赖性问题的一个很好的总结,它解释了为什么必须避免在具有开始级别的捆绑包之间定义依赖性


我的团队对类似问题使用了起始级别。这是发现问题的好方法,如果你没有时间立即解决根本问题,这是一个有用的短期解决方案。取决于起始订单,这将导致极端脆弱性。不过,启动级别的另一个用例是优化。您的捆绑包应该始终工作,无论它们以什么顺序启动。。。然而,有时一个包可能需要做更多或更少的工作,这取决于它的开始顺序。所以你可以使用启动级别来优化你的应用程序的性能,只是不要依赖它们来实现实际的功能。谢谢Neil。我没有考虑效率问题,但这很有意义。我们没有使用Maven,我们使用equinox而不是felix。还有什么建议吗?Equinox应该不会对SCR造成影响,如果你不使用Maven,你可以直接使用Bnd()——这就是我提到的Maven插件在引擎盖下使用的。