Причина была в состоянии гонки с 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()
, вероятно, является лучшей идеей, но этот код показывает, что на самом деле происходит.
Спасибо за помощь всем!