我正在制作OSGi捆绑包,并具有一些它需要的可配置参数。我遵循了instructions for karaf,配置值显示在webconsole中。但是如何在Java中使用它们?
我在执行器context.getProperty("prop1")
甚至registering a ManagedService中都尝试过System.getProperty("prop1")
。该属性始终返回为null。这应该真的很容易。我想念什么?
答案 0 :(得分:0)
将配置属性设置为1
,etc/system.properties
应该可以工作。
属性占位符(请参见40482233)和System.getProperty()
(请参见30474886)也可以实现同样的目的。
答案 1 :(得分:0)
它显示了如何以编程方式和使用蓝图使用ConfigAdmin属性。
答案 2 :(得分:0)
原因是使用updated()
的{{1}}方法的竞争条件。它在调用ManagedService
时执行,但registerService()
不返回具有配置信息的configRef
。另外,传递给properties
的字典不会填充现有的配置值。
这里有一些简单的示例代码来更好地解释。 (注意:registerService()
是groovy中的保留字。可能在这里引起一些问题):
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
更改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
}
方法以填充类级Dictionary字段似乎可行。实际上,在updated()
方法中为configuration
使用d
可能是一个更好的主意,但是此代码显示了实际情况。
感谢大家的帮助!