2015-10-09 73 views
1

我有使用配置文件org.jemz.karaf.tutorial.hello.service.config.cfg有一個屬性捆綁:Karaf添加額外的屬性,以現有的配置文件

org.jemz.karaf.tutorial.hello.service.msg="I am a HelloServiceConfig!!" 

我使用ConfigAdmin藍圖是這樣的:

<cm:property-placeholder persistent-id="org.jemz.karaf.tutorial.hello.service.config" update-strategy="reload" > 
    <cm:default-properties> 
     <cm:property name="org.jemz.karaf.tutorial.hello.service.msg" value="Hello World!"/> 
</cm:default-properties> 
</cm:property-placeholder> 



<bean id="hello-service-config" 
     class="org.jemz.karaf.tutorial.hello.service.config.internal.HelloServiceConfig" 
     init-method="startup" 
     destroy-method="shutdown"> 

    <property name="helloServiceConfiguration"> 
     <props> 
       <prop key="org.jemz.karaf.tutorial.hello.service.msg" value="${org.jemz.karaf.tutorial.hello.service.msg}"/> 
     </props> 
    </property> 
</bean> 

<service ref="hello-service-config" interface="org.jemz.karaf.tutorial.hello.service.IHelloService" /> 

這工作正常只要我可以更改該屬性的值並且該包自動更新該屬性。

我想知道是否有任何添加新的屬性到我的配置文件,而不必改變藍圖(這涉及到編譯/包再次)的任何方式。當然,我的包應該準備好處理新的屬性。

不知道這在OSGi中是否有意義。任何人都可以給我提示如何動態地將新屬性添加到現有配置文件並使其在ConfigAdmin中可用?

回答

0

@yodamad向我表明性能在我ConfigurationAdmin服務更新,但不幸的是我bundel沒有在接受因爲新的屬性bean定義我只是使用一個固定的屬性。

最後,以獲得從配置文件新的屬性我已經改變了我的藍圖的定義如下:

<cm:property-placeholder persistent-id="org.jemz.karaf.tutorial.hello.service.config" update-strategy="reload" > 
</cm:property-placeholder> 

<bean id="hello-service-config" 
     class="org.jemz.karaf.tutorial.hello.service.config.internal.HelloServiceConfig" 
     init-method="startup" 
     destroy-method="shutdown"> 
</bean> 

<service ref="hello-service-config" interface="org.jemz.karaf.tutorial.hello.service.IHelloService" /> 


<reference id="hello-service-config-admin" interface="org.osgi.service.cm.ConfigurationAdmin" 
      availability="optional"> 
    <reference-listener bind-method="setConfigAdmin" 
         unbind-method="unsetConfigAdmin"> 
     <ref component-id="hello-service-config"/> 
    </reference-listener> 
</reference> 

我到ConfigurationAdmin服務的引用,因此,現在我可以檢查所有屬性,我的包作爲:

public void setConfigAdmin(ConfigurationAdmin cfgAdmin) { 
    this.cfgAdmin = cfgAdmin; 
    try { 
     Configuration cfg = cfgAdmin.getConfiguration("org.jemz.karaf.tutorial.hello.service.config"); 
     Dictionary<String, Object> properties = cfg.getProperties(); 
     Enumeration<String> en = properties.keys(); 
     while(en.hasMoreElements()) { 
      String key = en.nextElement(); 

      System.out.println("KEY: " + key + " VAL: " + properties.get(key)); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

正如我的「更新策略」是reload每當一個新的ConfigurationAdmin服務被註冊,我可以得到更新。

歡迎對我的方法發表任何評論!

+0

你也可以使用一個類來實現ConfigurationListener ,BundleContextAware'接口。然後,您將收到有關配置更改的所有事件,因此您可以在應用程序中處理任何您想要的內容 – yodamad

1

可以在karaf外殼添加屬性:

1/config:edit org.jemz.karaf.tutorial.hello.service.config

2/config:propset <key> <value>

3 /最後config:update保存更改文件。

如果你想這樣做編程,檢查karaf源以查看實現

+0

感謝您的回答。您的解決方案有效,屬性存儲在屬性的佔位符中,我可以列出它們。問題是我的包不能獲得這些新屬性。我認爲它與bean定義有關,我只設置了一個要注入的屬性「org.jemz,karaf.tutorial.service.msg」,因此我無法在我的'setHelloServiceConfiguration'方法中獲得更多屬性。我已經想出了從我的配置文件中獲取新屬性的另一種方法,我會將其發佈在我的答案中。無論如何,我會給你一個想法 –

+0

喜歡Jorge,如果你使用的是SpringDM,我可以給你配置的樣本,以便能夠爲一個包管理多個配置文件 – yodamad

相關問題