2015-10-09 40 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

相关问题