【问题标题】:When is an OSGi fragment attached to host?何时将 OSGi 片段附加到主机?
【发布时间】:2012-06-17 06:57:05
【问题描述】:

我有一个带有持久性服务的OSGi 捆绑包(使用hibernate)和一个包含配置(xml 文件)的片段。在捆绑包的激活器中,我正在使用以下方式加载配置:

@Override
public void start(BundleContext ctx) {
   URL url = ctx.getBundle().getResource("hibernate.cfg.xml");
   SessionFactory sessionFactory = new AnnotationConfiguration().configure(url).buildSessionFactory();
}

但有时,URL 为空。当我试图列出所有可用的URLs(使用findEntries 方法)时,似乎捆绑包自己的总是可用的,但片段的只是有时。我正在使用Felix 4.0.2,捆绑包和片段以相同的Felix 启动。 auto.start 级别。

【问题讨论】:

    标签: java osgi osgi-fragment


    【解决方案1】:

    在解析 主机 时,片段会附加到主机。通常,只要在主机解析之前安装片段,就会附加片段。

    但是,主机总是有可能在没有分片的情况下解析,因为主机不依赖于它们的分片。因此,通常你应该编写你的主机,以便它可以处理不存在的片段——即它不应该抛出 NPE 等。

    从 OSGi R4.3 开始,您可以使用 Require-CapabilityProvide-Capability 标头从主机向其片段引入依赖关系。通过为依赖项发明你自己的命名空间,你可以让你的片段为它提供Provide-Capability。然后您的主机可以使用Require-Capability.... 要求它。现在 OSGi 框架将确保在解析主机之前该片段必须可用。

    【讨论】:

    • 这很方便。我实际上从未见过用例失败(我们使用 Equinox),但我没有意识到它可能无法“及时”解决片段。很高兴知道。
    • 我希望 StackOverflow 让我订阅用户,这样我就可以阅读 Neil 发布的所有内容。 :-) 几乎每次他回答我都会学到新东西!
    【解决方案2】:

    在片段包的解析过程中,片段被附加到主机。 主机已解析,即使分片不存在也能成功启动;但片段依赖于主机 - 只有在附加到主机后才能解析并随后启动。

    通过使两个包具有相同的起始级别,您似乎为这两个包创建了竞争条件。框架同时开始解析和启动两个包。有时它设法在片段的解析过程完成之前启动主机包 -> 然后主机包的启动方法表现得好像没有可用的片段一样。

    你可以做的是例如为片段提供比主机包更早的启动级别。即使主机包尚未启动,片段也应该解析并成功启动。它只需要解析主机包。

    您还可以在其他 OSGi 框架上测试此行为 - 例如。在 ProSyst's mBedded Server (mBS) - 我知道它完全符合 OSGI 规范 4.2,其中指定了上述片段解析。

    【讨论】:

    • 感谢您的澄清!不幸的是,它不起作用。我已将片段的 felix.auto.start 级别设置为低于捆绑包本身的级别。我在 gogo 控制台中仔细检查了这一点 - 捆绑包的级别高于片段。我觉得起始级别并不能保证较低级别的捆绑包/片段会在进入较高起始级别之前完成其解析。
    • 这是不正确的。首先,片段在 host 被解析时附加。二是框架不解析与启动同时进行。事实上,启动对分辨率没有任何影响,无论如何也无法启动片段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多