2010-07-18 26 views
1

在我當前的應用程序中,我想通過用戶界面在運行時創建和配置osgi服務。我研究過OSGi Metatype規範,但它只支持簡單的類型屬性。動態創建和配置具有依賴關係的OSGi服務

所以我的問題是:是否有一個很好的理由有屬性類型不支持,如其他OSGi服務,沒有人知道一個已經存在的項目,做這樣的事情?

UPDATE

爲了進一步澄清我的問題:

什麼我想要做的是創造,並根據需要通過軟件的用戶配置新的服務。如果將新的服務接口添加到系統中,這應該甚至可以工作。

讓我們假設我有一個服務接口,用於發送通知

public interface NotificationService { 
    void notify(Notification n); 
} 

和用於發送通知到例如一個實現推特。通過Metatype規範,我可以編碼Twitter服務需要用戶名和密碼的信息。這使我可以在運行時動態創建一個用於創建新的twitter通知服務的UI。

這適用於簡單的數據類型,但元類型規範不處理依賴於其他服務。例如。可以說Notification具有文件附件,因此Twitter服務需要FileUpload服務來存儲文件。

回答

0

可以使用的BundleContext#registerService(),但是當時的服務必須已初始化並準備運行始終注入新的服務。您可能會發現OSGi 4.2規範的新Blueprint服務 - 甚至動態服務,這種服務雖然比較老,但更爲廣泛。

最終,它取決於你想要做什麼。當你在運行時說「創建」和「配置」osgi服務時,你是什麼意思?

+0

我試圖通過一個例子來闡明我的問題。我希望這有助於理解我想要做什麼。 – crazymaik 2010-07-22 13:57:03

+0

舉個例子。 Metatype服務不能幫助您,我認爲這與您設想的用例不太匹配。你可以做的是擁有一個簡單的字符串值屬性,並提供特定文件上傳服務的可用選項(當然,這些服務之間的硬編碼依賴關係 - 如果您使用新的文件上傳服務添加捆綁軟件,會發生什麼情況?)然後使用ServiceTracker獲取具有自定義屬性過濾器的服務。 我認爲使用自己的元數據描述系統(使用註釋!)會更好地爲你工作。甚至是Eclipse註冊表。 – 2010-07-22 15:17:27

+0

只是想知道這是否回答了crazymaik的原始問題。 – 2010-08-08 10:10:55

0

所以在你的例子中,你基本上說可以配置一個服務的實現,並且該配置可能會聲明該實現需要另一個服務。基本上,你正在尋找一個系統,允許你在代碼中聲明一個實現的依賴關係,而不是靜態的XML文件(就像聲明式服務和大多數其他服務一樣)。

一個解決問題的方法是使用Apache菲利克斯依賴管理。它有一個聲明式Java API,允許您在運行時添加和刪除依賴項。可以在這裏找到一些基本的例子:http://felix.apache.org/site/apache-felix-dependency-manager-getting-started.html我建議你從源代碼構建一個3.0.0-SNAPSHOT,因爲這是迄今爲止最新,最好,相當穩定的。

如果有幫助,我可以爲你提供上面描述的例子中實際的示例代碼。讓我知道。