【问题标题】:osgi bundle lifecycle questionosgi bundle 生命周期问题
【发布时间】:2011-10-06 15:39:04
【问题描述】:

我尝试了解 osgi 的工作原理。我已经编写了我的第一个 hello-world 包,它在执行包激活器类的启动方法时提供了一些控制台输出。现在,我已经阅读了关于延迟启动机制的信息,并将这个标志放在我的捆绑清单中。然后,我启动了 Equinox 控制台,安装了我的包并启动了它。但现在我希望我的捆绑包被标记为“开始”。但相反,它已经调用了它的 start 方法并被标记为活动的。 懒人启动机制我理解有什么问题吗???

【问题讨论】:

    标签: java eclipse osgi bundle equinox


    【解决方案1】:

    您说,您在安装后已经启动了您的捆绑包 - 如果您手动启动您的捆绑包,无论延迟激活策略如何,它都会被激活。

    根据the OSGi specification,激活如下:

    延迟激活策略表明捆绑包一旦启动,必须 在从中加载类之前不会被激活;无论是在正常情况下 类加载或通过 Bundle loadClass 方法。资源加载 不会触发激活。这从默认的渴望改变 激活策略反映在捆绑包的状态及其 事件。当使用延迟激活策略启动捆绑包时, 必须采取以下步骤:

    • 为捆绑包创建捆绑上下文。
    • 捆绑包状态已移至 STARTING 状态。
    • LAZY_ACTIVATION 事件被触发。
    • 系统等待从包中加载类。
    • 触发正常的 STARTING 事件。
    • 捆绑包已激活。
    • 捆绑包状态已移至 ACTIVE。
    • 已触发 STARTED 事件。

    如果激活失败是因为 Bundle Activator 启动方法有 抛出异常,必须停止捆绑而不调用 捆绑激活器停止方法。这些步骤在流程图中描绘 在图 4.29 中。此流程图还显示了 普通急切激活和惰性激活策略 激活。

    更新:因为我不能说我在写答案时打开了哪个版本的规范(但是,我相信它是 4.2 或 4.3),我已经检查了当前, v5.0 规范,第 4.4.6.2 节包含实际的、语义等价的地方。

    【讨论】:

    • 您应该提供规范的来源。规范可能会随着时间而改变,未来的读者(比如我)不知道你从哪里以及从哪个版本得到了那个报价。
    • 感谢您的评论;我已经添加了对规范的引用。
    【解决方案2】:

    当您有 其他 个依赖于您的捆绑包和捆绑包中的类的捆绑包时,使用延迟启动标志。

    假设您有两个捆绑包 A 和 B,其中

    • A 导出类 C
    • B 依赖于 A
    • B 包含一个引用 C 的 D 类

    激活捆绑包 B 时会发生什么?

    没有延迟加载标志,首先加载并激活 A 包。

    使用延迟加载标志,在类 D 需要引用类 C 之前,不会加载或激活 A 包。

    这会对激活配置文件产生很大的影响,因为捆绑包的加载和激活被延迟加载标记尽可能晚地发生,因此捆绑包的初始响应非常快......

    相反,这个标志也使得推断 B 中方法的执行时间变得更加困难,因为这可以随时通过加载和激活捆绑包来拦截....

    【讨论】:

    • 非常感谢你们!!!!这在我的书中没有很好地解释,但现在我明白了:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2020-07-14
    • 2011-02-22
    相关资源
    最近更新 更多