我试着了解osgi的工作原理。我编写了我的第一个hello-world bundle,它在执行bundle activator类的start方法时提供了一些控制台输出。现在,我已经阅读了关于延迟启动机制的内容,并将此标志放入我的捆绑清单中。然后,我启动了equinox控制台,安装了我的软件包并启动了它。但现在我希望我的包被标记为'开始'。但它已经调用它的start方法并被标记为活动。 我对懒惰的启动机制有什么不妥吗?
答案 0 :(得分:8)
当您拥有其他捆绑包时,会使用lazy-start标志,这些捆绑包依赖于捆绑包中的捆绑包和类。
假设您有两个捆绑A和B,其中
捆绑B被激活后会发生什么?
没有延迟加载标志,首先加载并激活A包。
使用延迟加载标志,在D类需要引用C类之前,不会加载或激活A包。
这可以在激活配置文件中产生很大的不同,因为捆绑的加载和激活被推迟到延迟加载标志发生,所以来自捆绑包的初始响应非常快...... / p>
相反,这个标志也使得很难推断B中方法的执行时间,因为这可以随时加载和激活bundle来拦截....
答案 1 :(得分:3)
你说过,你已经在安装后启动了捆绑包 - 如果手动启动捆绑包,无论延迟激活策略如何都会激活它。
根据the OSGi specification,以下情况适用于激活:
延迟激活策略表示捆绑包一旦启动,就必须 从类加载类之前不会被激活;要么正常 类加载或通过Bundle loadClass方法。资源加载 不会触发激活。这种改变来自默认的渴望 激活策略反映在捆绑包的状态及其中 事件。使用延迟激活策略启动捆绑包时, 必须采取以下步骤:
- 为捆绑包创建捆绑上下文。
- 捆绑状态将移至STARTING状态。
- 触发了LAZY_ACTIVATION事件。
- 系统等待捆绑包中的类加载发生。
- 正常的STARTING事件被触发。
- 捆绑已激活。
- 捆绑状态将移至ACTIVE。
- STARTED事件被触发。
如果激活因Bundle Activator start方法失败而失败 抛出一个异常,必须在不调用的情况下停止bundle Bundle Activator停止方法。这些步骤如流程图所示 在图4.29中。该流程图还显示了差异 正常的急切激活和懒惰的激活策略 活化。
更新:因为我不能说我在编写答案的时候打开了哪个版本的规范(但是,我相信,它是4.2或4.3),我已检查了当前,v5.0规范和4.4.6.2节包含实际的,语义上等效的地方。