2013-06-18 55 views
1

我有一個龐大的應用程序和庫的生態系統,目前作爲各種應用程序服務器(例如JBoss AS)中的.jar集合進行部署,我試圖弄清楚一套好的工具來管理依賴關係和生活 - 各種封裝的週期。OSGi和...?我用什麼來控制裝載/卸載/重新裝載包裝?

我認爲包裝的如在(至少)三種可能的狀態是:「卸載」,「未決」和「加載」,寬鬆地定義爲如下:

  • 卸載:該包暫時不可用。
  • 待定:程序包本身可用,但不是所有的依賴項。因此,目前無法使用。
  • 加載:該軟件包可用,並且其所有依賴項都滿足。如果它是一個應用程序,它可以運行 - 如果它是一個庫,它已準備好被另一個包使用。

(也可能有幾個州,如「失敗」對於試圖加載,但沒有一些其他原因比依賴不滿意包等...)

在一包的生命週期,許多事情可能會導致包這三者之間改變狀態:

  • 一個包,沒有依賴加載,並且去從卸載加載
  • 一個包試圖加載,但並非所有的依賴都滿足;它從卸載待定
  • 包中的狀態突然有其所有依賴關係滿足(因爲其他一些包去了狀態加載),並自動開始加載本身;從轉換到加載
  • 包被卸載。所有依賴於現在卸載的包的加載的包從加載等待
  • 程序包已更新爲新版本。所有相關的軟件包會自動重新加載,以訪問更新的版本。

我已經開始使用OSGi定義的依賴關係的工作 - 它與我們的編譯系統以及滾動和生產可靠的相關性信息。但是,如果我將兩個OSGi軟件包AB加載到JBoss中,其中B依賴於A,然後卸載A,看起來B看起來像愉快地繼續運行。我明白,我可以用一些鉤子來控制低級別的框架事件(框架事件),但是我的蜘蛛感覺是刺痛的,說必須有更好的方法來做到這一點

是否有一個很好的工具/框架/任何你想要調用它將讚揚OSGi在這些方面?

+1

將此輸入爲評論而非答案,因爲問題中有很多移動部分,我沒有時間全部回答。但是:卸載軟件包不會影響從屬軟件包*,除非您執行刷新操作*。該刷新允許OSGi重新計算軟件包線路,此時具有缺失相關性的軟件包將變得無法解析。這種獨立刷新的原因是解析代價昂貴,因此應該將一系列更新/安裝/卸載組合在一起。 –

+1

至於更高層次的工具,我建議您閱讀有關OSGi R5存儲庫和解析器規範。您應該專注於配置*組的捆綁,並且解析器規範可以幫助您計算出這些組的正確內容。您可以使用[Bndtools](http://bndtools.org)2.1版來試用解析器。 –

回答

0

如果聲明模塊之間的依賴關係,則生命週期得到適當管理,並且在頂級模塊停止之前必須停止子系統的解除擴展。

但是,停止模塊只不過是將事件發送到捆綁激活器並從類加載器中移除引用。任何活動(例如線程或分佈式實例)都必須手動清理。例如,您必須調用org.apache.commons.logging.LogFactory.release(ClassLoader)(如果使用公共日誌記錄)或刪除任何注入的UI組件。

+0

當依賴被重新安裝(也許是更新的版本)時,JBoss是否也會重新加載相關的bundle? –

+0

我正在構建基於Apache Felix(OSGi實現)的自定義服務器平臺。 我想JBoss AS正在使用「平臺」部署架構。在這種情況下,模塊列表取決於存儲庫。如果從屬捆綁包屬於存儲庫,則必須在平臺重新啓動時重新啓動它們。 – LoganMzz

3

在OSGi中,現有的類加載器將保持活動狀態,直到您刷新框架。所以,如果你卸載B(其中A取決於B),那麼A將繼續在你刷新的時候繼續攪動。您可以刷新整個框架或僅刷新受指定軟件包影響的軟件包(例如刷新B)。

刷新的目的是更新/卸載/安裝一組軟件包,然後在原子操作中應用更改。

+0

你如何調用刷新操作? –

+0

舊的(也是最常用的模型)是獲取PackageAdmin服務,然後調用refreshPackages(null)(http://www.osgi.org/javadoc/r4v43/core/org/osgi/service/packageadmin/PackageAdmin .html#refreshPackages(org.osgi.framework.Bundle []))。但是,該服務已被棄用。所以新的方法是獲取Bundle 0(context.getBundle(0)),然後調用adapt(FrameworkWiring.class)。生成的FrameworkWiring有一個refreshBundles方法。 –