我试图了解osgi是如何工作的。我已经编写了我的第一个hello-world包,当执行包激活器类的start-method时,它会给出一些控制台输出。现在,我已经了解了延迟启动机制,并将此标志添加到我的包清单中。然后,我启动了equinox控制台,安装了我的包并启动了它。但现在我希望我的捆绑包被标记为“开始”。但是它已经调用了它的start方法,并被标记为活动的。我理解懒惰启动机制有什么问题吗?
发布于 2011-07-16 16:44:38
当您有其他依赖于您的包和包中的类的包时,可以使用lazy-start标志。
假设您有两个包A和B,其中
的类D
当捆绑包B被激活时会发生什么?
如果没有lazy-load标志,则首先加载并激活A包。
使用lazy-load标志,直到类D需要引用类C时,才加载或激活A包。
这可能会在激活配置文件中产生非常大的差异,因为使用lazy-load标志将bundle的加载和激活推迟到尽可能晚的时间,因此来自bundle的初始响应非常快……
相反,这个标志也使得B中方法的执行时间更难推断,因为这可以在任何时候通过加载和激活包来截获……
发布于 2011-07-16 16:44:09
您说过,您已经在安装后启动了捆绑包-如果您手动启动捆绑包,则无论延迟激活策略如何,它都会被激活。
根据the OSGi specification的说法,对于激活,以下情况是正确的:
捆绑激活策略指出,捆绑包一旦启动,就不能被激活,直到从它加载了一个类;无论是在正常的类加载过程中,还是通过
loadClass方法。资源加载不会触发激活。这种对默认紧急激活策略的更改反映在捆绑包及其事件的状态中。当使用惰性激活策略启动捆绑包时,必须执行以下步骤:
>H213
如果由于Bundle Activator start方法抛出异常而导致激活失败,则必须在不调用bundle Activator stop方法的情况下停止捆绑包。这些步骤如图4.29中的流程图所示。此流程图还显示了正常紧急激活和懒惰激活的激活策略的差异。
更新:因为我不能说我在写答案的时候打开了哪个版本的规范(然而,我相信它是4.2或4.3),我已经检查了当前的v5.0规范,4.4.6.2节包含了实际的、语义等价的地方。
https://stackoverflow.com/questions/6715909
复制相似问题