2013-11-15 23 views
2

我有一個(BND註釋的)組件實現一個簡單的API,並公開本身作爲配置服務..用XML(而不是屬性)

package com.mycompany.impl; 
import com.mycompany.api.IFoo; 

@Component(designateFactory=FooImpl.Configuration.class) 
class FooImpl implements IFoo { 

    interface Configuration { 
    String foo(); 
    // .. 
    } 

    Configuration configuration; 

    @Activate 
    public void activate(Map properties) { 
    configuration = Configurable.createConfigurable(Configuration.class, properties); 
    // .. 
    } 

} 

其配置是從觀看目錄加載一個服務通過Felix FileInstall並且服務由Felix配置服務實例化(至少,我認爲這是最新發生的事情 - 我是OSGi的新手,請耐心等待)使用生成的MetaType描述符工作得很好。但是,就目前而言,FooImpl需要結構化配置(列表清單,列表映射等),我想知道是否有一種優雅的(*)方法通過類似的工作流配置組件實例;也就是說,配置發現和實例化/部署仍然是集中的。

在我看來,配置服務規範管理地圖 - 我將不得不推出我自己的配置服務& FileInstall能夠呈現具有xml/json/yaml支持的結構化配置的組件?

  • 與定義XML配置文件在屬性中的位置相反...... confiception?並做我自己的解析。

回答

3

是的,沒有...

與抽象的配置記錄,這是基於平面地圖OSGi的配置管理服務交易(實際上java.util.Dictionary,但它本質上是相同的東西)。配置管理員對不是瞭解底層物理存儲的任何信息;它總是依靠別人來呼籲ConfigurationAdmin服務中的方法,即getConfigurationcreateFactoryConfiguration

的「別人」調用配置管理通常被稱爲「管理代理」。 Felix FileInstall是管理代理程序的一個非常簡單的示例,它以Java屬性格式讀取文件。其實FileInstall大概也是很簡單,我不認爲它適合於生產部署 - 但這是一個單獨的討論。

聽起來好像你想編寫自己的管理代理程序來讀取XML文件並將它們提供給配置管理員。這並不是一項艱鉅的任務,你不應該害怕接受它。 Config Admin的設計是基於這樣的假設,即應用程序對配置數據存儲的要求非常不同,並且大多數應用程序因此必須編寫自己的簡單管理代理,這就是爲什麼它沒有定義自己的存儲格式或位置, 。

但是,一旦配置數據已被管理代理讀取,它必須作爲映射/字典傳遞到配置管理員中,然後將映射/映射傳遞給組件。因此,組件本身不會收到高度結構化的數據,例如樹木或嵌套地圖。雖然有一些靈活性:配置屬性可以包含基礎類型的列表;你也可以使用枚舉值等。

+0

謝謝。那麼,物理存儲器中的值類型限制(僅適用於FileInstall處理屬性文件)? 看起來像ConfigurationAdmin接口將採取任何字典 - 我不知道如何/字符串的關鍵限制執行(<1.5支持?:)),theres沒有任何阻止我發送Dictionary 與從XML解組對象? – pgn

+0

如果嚴格遵循規範,則值類型僅限於OSGi主要屬性類型;請參閱OSGi Core規範第3.2.7節中標題爲「主要屬性類型」的圖。 –

+0

是的,鍵必須是字符串(OSGi Compendium,第104.4.3節)。它將是'Dictionary ',但是規範早於Java 5泛型。 –

相關問題