繁体   English   中英

什么时候OSGi片段附加到主机?

[英]When is an OSGi fragment attached to host?

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

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

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

片段连接到主机,在主机解决的时间。 通常,只要在主机解析之前安装了片段,它就会被连接。

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

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

在片段束的解析过程期间,片段附着到主机。 主机已解析,即使片段不存在,也可以成功启动; 但是片段依赖于主机 - 它可以被解析,然后只有在它连接到主机后才能启动。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM