2011-11-12 43 views
1

我有一個使用OSGi在運行時加載模塊化功能的動態應用程序。 OSGi軟件包包含模塊化功能,應用程序在需要時加載軟件包。這種方法工作正常,但我想要一個更細化的解決方案。這些軟件包包含通過聲明式服務控制的組件。我希望能夠加載一個包,並且只啓用該包中所需的組件。我已經完成了這方面的研究,但是找不到我滿意的解決方案。一種方法是創建一個始終在包中啓用的「網守」組件,並通過ComponentContext讓它調用啓用和禁用組件。這是一個可行的解決方案,但我無法找到一種方法讓「網守」「瞭解」捆綁包中的其他組件,而無需將組件名稱硬編碼爲「網守」SCR xml描述符中的屬性。OSGi和組件管理

我更喜歡的是一種加載包和「瞭解」加載包中的所有組件的方法。能夠確定組件所在的組件以及它們當前處於什麼狀態(類似於列出所有組件的equinox控制檯命令'ls')。我想在需要時啓用和禁用組件。

控制檯如何執行此操作,以及如何在應用程序中執行此操作?

更新: @尼爾巴特利特:對不起,延遲。我不得不轉向別的東西。現在我回到這個問題上。真的很感激任何進一步的援助。我的應用是基於角色的。我需要根據它們提供的功能來啓用組件。目標是所有基於角色的組件最初都被禁用。在角色更改時,角色管理器會輪詢每個組件提供的功能,並確定是否加載它。每個組件將廣播它提供的功能(通過通用服務接口)。 ScrService不允許我啓用最初禁用的服務組件。讓組件最初啓用並讓ScrService在應用程序啓動期間儘快禁用它們並不符合我的需求。

+0

是的,看門人需要知道它希望啓用/禁用的組件的ID。請記住,您也可以通過'null'來啓用/禁用包中的所有其他組件。同樣如您所知,網守只能訪問同一捆綁包中的其他組件,而不能訪問其他任何捆綁包。從「四十二」使用ScrService的建議是一個很好的建議。 –

+0

@Toolshed你最終解決了這個問題嗎?我有與ScrService相同的問題。 –

+0

@PabloGarcía結束了一個非常混亂的實現,它需要一個自定義的scr xml解析器。它工作正常,但遠非理想,並且爲我的定製需求而工作。 – Toolshed

回答

1

看一看ScrService。在春分和felix有它。然而,可以使組件延遲加載,即僅當其他組件/捆綁需要時才加載組件;但這可能不是你想要的。

+0

ScrService正是我所需要的。這將允許我根據需要動態啓用和禁用組件。 – Toolshed

+0

使用ScrService之後,我發現了一個我無法逾越的問題。只有組件最初啓用時,我才能在外部啓用和禁用組件(不在同一捆綁包中)。我需要最初禁用組件,然後在需要時啓用組件。這不起作用。如果一個組件最初被禁用,它會顯示(從調試)一個不滿意的狀態。如果組件不滿意,則無法啓用。這是一個錯誤?當然,這不是意圖。 – Toolshed

+0

輸出示例: 的OSGi> LS -C 21個 組件在束測試: ID組件細節 37成分[ 名= test.TestImpl 激活=激活 停用=停用 改性= 配置策略=忽略 工廠= NULL 自動啓用=假 立即=真 實施= test.TestImpl **狀態=不合格** 屬性= 的ServiceFactory =假 serviceInterface等= [了java.util.Comparator] 引用=正ULL 位於束= Test_1.0.0 [21] ] 動態信息: **該組件滿足** 所有部件引用滿意 元器件配置: – Toolshed

0

在您的服務描述中,將組件標記爲啓用,但需要配置管理服務提供的配置信息。然後您可以編寫CM插件服務(不記得確切的術語),可以發佈和修改組件的配置。默認情況下,服務由其名稱標識,默認情況下是它們的實現類名稱。配置數據作爲映射傳遞,並且可以爲空。 DS會在CM提供配置後儘快提供該服務。

+0

我需要在組件與它們處於活動狀態之前進行通信。這就是爲什麼ScrService更具吸引力。我已經更新了我的原稿來澄清。 – Toolshed

0

我有一個類似的問題,但爲了不同的目的: - 我有apache文件安裝和配置管理服務來配置我的組件外部屬性文件。 - 我需要確保某些組件從外部文件獲取配置,而我迄今發現的唯一方法是使用ConfigurationPolicy.REQUIRED標記組件。 - 但這樣我的插件項目不會在eclipse中運行(沒有配置文件的地方)。 - component.xml還包含一個默認的開發配置,所以我沒有問題,只是我的組件不會啓動,直到配置數據可用configadmin取消。我的組件不滿意這種方式,直到有人創建一個configadmin條目。 - 我想,如果我創建一個osgi命令行擴展器,將空配置發送給服務pid,它們將以component.xml文件中的默認值啓動。 - 我剛來這裏找到一種方式來列出所有包

但我認爲這個解決方案我使用也可以與您的設置,這就是爲什麼我寫這個。 只需用configurtationpolicy.require標記所有組件,您就可以選擇性地使用configadmin添加和刪除配置來啓動和停止它們。如果您已經將configadmin用於其他用途,這可能很難,但作爲最後的手段它可能是可管理的。