我尝试了解 osgi 的工作原理。我已经编写了我的第一个 hello-world 包,它在执行包激活器类的启动方法时提供了一些控制台输出。现在,我已经阅读了有关延迟启动机制的信息,并将这个标志放在我的捆绑清单中。然后,我启动了Equinox 控制台,安装了我的包并启动了它。但现在我希望我的捆绑包被标记为“开始”。但相反,它已经调用了它的 start 方法并被标记为活动的。我理解惰性启动机制有什么问题吗???
2 回答
当您有其他捆绑包依赖于您的捆绑包和捆绑包中的类时,使用延迟启动标志。
假设您有两个捆绑包 A 和 B,其中
- A 导出 C 类
- B 取决于 A
- B 包含一个引用 C 的类 D
当捆绑 B 被激活时会发生什么?
如果没有延迟加载标志,则首先加载并激活 A 包。
使用延迟加载标志,在类 D 需要引用类 C 之前,不会加载或激活 A 包。
这可以在激活配置文件中产生非常大的差异,因为捆绑的加载和激活被推迟到尽可能晚地使用延迟加载标志,因此来自捆绑的初始响应非常快......
相反,这个标志也使得推断 B 中方法的执行时间变得更加困难,因为这可以随时通过加载和激活包来拦截......
你说,你已经在安装后启动了你的包——如果你手动启动你的包,不管惰性激活策略如何,它都会被激活。
根据OSGi 规范,激活以下内容是正确的:
延迟激活策略表明捆绑包一旦启动,在从其中加载类之前不得激活;在正常类加载期间或通过 Bundle loadClass 方法。资源加载不会触发激活。对默认的 Eager 激活策略的这种更改反映在包的状态及其事件中。当使用延迟激活策略启动捆绑包时,必须执行以下步骤:
- 为捆绑创建捆绑上下文。
- 捆绑包状态移至 STARTING 状态。
- LAZY_ACTIVATION 事件被触发。
- 系统等待来自捆绑的类加载发生。
- 触发正常的 STARTING 事件。
- 捆绑包已激活。
- 捆绑包状态移至 ACTIVE。
- STARTED 事件被触发。
如果激活失败是因为 Bundle Activator start 方法抛出了异常,则必须停止 bundle 而不调用 Bundle Activator stop 方法。这些步骤如图 4.29 的流程图所示。该流程图还显示了正常的 Eager 激活和惰性激活的激活策略的差异。
更新:因为我不能说我在写答案时打开了哪个版本的规范(但是,我相信它是 4.2 或 4.3),我检查了当前的 v5.0 规范和第 4.4 节。 6.2 包含实际的、语义等价的地方。