簡體   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