Использование конфигурации для пакета OSGi - PullRequest
0 голосов
/ 04 сентября 2018

Я делаю комплект OSGi и имею несколько настраиваемых параметров, которые ему нужны. Я следовал инструкциям для karaf , и значения конфигурации отображаются в веб-консоли. Но как их можно использовать в Java?

Я пытался context.getProperty("prop1") в приводе, System.getProperty("prop1") и даже при регистрации ManagedService . Свойство всегда возвращается как нулевое. Это должно быть действительно легко. Что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Взгляните на этот учебник: http://liquid -reality.de / display / liquid / 2011/09/23 / Karaf + Учебник + Part + 2 + - + Использование + Конфигурация + Администратор + Сервис

Показывает, как работать со свойствами ConfigAdmin как программно, так и с использованием чертежей.

0 голосов
/ 05 сентября 2018

Причина была в состоянии гонки с updated() методом ManagedService. Он выполняется при вызове registerService(), НО configRef НЕ возвращает properties, который имеет информацию о конфигурации. Кроме того, словарь, переданный в registerService(), не заполняется существующими значениями конфигурации.

Вот несколько примеров отличного кода, чтобы объяснить лучше. (Примечание: properties это зарезервированное слово в groovy..maybe, которое вызывает некоторые проблемы здесь):

class Activator implements BundleActivator, ManagedService{
private ServiceRegistration<ManagedService> configRef
private Dictionary<String,?> configuration

@Override
void start(BundleContext context) throws Exception {
    Dictionary d=new Hashtable()
    d.put(Constants.SERVICE_PID,myPID)
    configRef=context.registerService(ManagedService,this,d)

    log.debug("context.getProperty():"+context.getProperty("prop1"))
    log.debug("System.getProperty():"+System.getProperty("prop1"))
    log.debug("configRef.properties.get():"+configRef.properties.get("prop1"))
    log.debug("d.get():"+d.get("prop1"))
    log.debug("configuration.get():"+configuration.get("prop1"))
 }

...

@Override
void updated(Dictionary<String, ?> properties) throws ConfigurationException {
    log.warn("properties.get() on updated():"+properties.get("prop1"))
    configuration=properties
}

Создает следующий вывод:

[WARN ] [..Activator] - properties.get() on updated():hello
[DEBUG] [..Activator] - context.getProperty():null
[DEBUG] [..Activator] - System.getProperty():null
[DEBUG] [..Activator] - configRef.properties.get():null
[DEBUG] [..Activator] - d.get():null
[DEBUG] [..Activator] - configuration.get():hello

Изменение метода updated() для заполнения поля словаря на уровне класса, похоже, работает. На практике использование configuration для d в методе start(), вероятно, является лучшей идеей, но этот код показывает, что на самом деле происходит.

Спасибо за помощь всем!

0 голосов
/ 04 сентября 2018

Установите свойства конфигурации на etc/system.properties, и System.getProperty() должно работать.

То же можно сделать с помощью заполнителей свойств (см. 40482233 ) и ConfigurationAdmin (см. 30474886 ).

...