什么是包依赖OSGI束(下Karaf)的天然启动顺序?(What is the natural st

2019-09-19 21:40发布

我有2.2.8版本Karaf的问题(最有可能在早期版本也是如此)。

我将使用Karaf到主机系统与动态配置包。 束由用户部署的,我不能事先它们自己知道。

我期待BundleActivator.start的顺序(),以完全对应打包捆之间的依赖关系(进口/出口包的依赖)和规划的期望,这将是安全的假设,bundle0将bundle1将要启动之前完全初始化。 但它不是这样 - 它似乎BundleActivator.start()在“随机”的顺序调用,而忽视束之间软件包的依赖关系。

样本用例,我有3个库

test-lib0 - defines testlib0.ITestRoot, exports testlib0 package 
test-lib1 - defines testlib1.TestRoot implements ITestRoot,  exports testlib1 package 
test-lib2 - uses both libs, ITestRoot and TestRoot 

当Karaf开始时,我看到下面的控制台输出示例

karaf@root> TestLib1Activator.start() 
TestLib2Activator.start() 
        ITestRoot: interface com.testorg.testlib0.ITestRoot - 16634462 
        TestRoot:  class com.testorg.testlib1.TestRoot - 21576551 
TestLib0Activator.start() 

但我相信它应该按以下顺序总是

TestLib0Activator.start() 
TestLib1Activator.start() 
TestLib2Activator.start() 
        ITestRoot: interface com.testorg.testlib0.ITestRoot - 16634462 
        TestRoot:  class com.testorg.testlib1.TestRoot - 21576551 

我安装示例项目的测试。 测试用例:后“MVN安装”刚刚摆脱./deploy文件夹罐子Karaf的同一文件夹中,跟踪消息应该出现在控制台中。 (注:它可以从第一次尝试正常工作,再试一次呢:))

样品测试项目http://karaf.922171.n3.nabble.com/file/n4025256/KarafTest.zip

注:这是来自交叉后http://karaf.922171.n3.nabble.com/What-is-the-natural-start-order-for-dependent-bundle-td4025256.html

Answer 1:

在OSGi中捆绑生命周期installedresolvedstartingstarted

进口包装和出口包装,只有当包从去影响installedresolved 。 因此,框架可以确保你从导入包中的所有捆束的前解决,但那么你的包只到resolved状态。 然后在第二步骤中的活化剂被调用。 所以,你不能假设活化剂被称为以相同的顺序。 如果你需要一些初始化之前你testlib2可以正常工作,那么你应该使用OSGi服务。

所以,如果我理解你的情况正确的,那么你testlib0定义了一个接口,testlib1实现它和testlib2想要使用的实施。 因此,要实现这一目标的最佳方式是发布IMPL在testlib1 OSGi服务和testlib3引用此服务。 然后,您可以用ServiceTracker的或如蓝图使用该服务。 我有一个小例子,显示这一点: http://www.liquid-reality.de/x/DIBZ 。 所以,如果你做你的情况下,像在我的例子蓝图可确保当服务是有testlib2的情况下只得到启动。 它甚至会停止testlib2当服务消失。



文章来源: What is the natural start order for package-dependent OSGI bundles (under Karaf)?