2015-10-09 8 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 definition Я просто использовал фиксированное свойство.

Наконец, чтобы получить новые свойства из конфигурационных файлов, которые я изменил свое определение Blueprint следующим образом:

<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

Привет, Хорхе, если вы используете SpringDM, я могу дать вам образец конфигурации, чтобы иметь возможность иметь несколько файлов конфигурации для одного пакета. – yodamad