Karaf 添加额外的 属性 到现有的配置文件
Karaf add additional property to existing config file
我有一个包,它使用配置文件 org.jemz.karaf.tutorial.hello.service.config.cfg
和一个 属性:
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" />
只要我可以更改 属性 的值并且捆绑包会自动更新 属性。
就可以正常工作
我想知道是否有任何方法可以在我的配置文件中添加一个新的 属性 而不必更改蓝图(再次涉及 compile/package)。当然我的包应该准备好处理新属性。
不确定这在 OSGi 中是否有意义。谁能告诉我如何动态地向现有配置文件添加新属性并使它们在 ConfigAdmin 中可用?
您可以在 karaf shell 中添加 属性 :
1/config:edit org.jemz.karaf.tutorial.hello.service.config
2/config:propset <key> <value>
3/ 最后 config:update
将更改保存到文件。
如果您想以编程方式执行此操作,请检查 karaf 源以查看实现
@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();
}
}
因为我的 'update-strategy' 是 reload
我可以在注册新的 ConfigurationAdmin 服务时得到更新。
欢迎对我的方法发表任何评论!
我有一个包,它使用配置文件 org.jemz.karaf.tutorial.hello.service.config.cfg
和一个 属性:
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" />
只要我可以更改 属性 的值并且捆绑包会自动更新 属性。
就可以正常工作我想知道是否有任何方法可以在我的配置文件中添加一个新的 属性 而不必更改蓝图(再次涉及 compile/package)。当然我的包应该准备好处理新属性。
不确定这在 OSGi 中是否有意义。谁能告诉我如何动态地向现有配置文件添加新属性并使它们在 ConfigAdmin 中可用?
您可以在 karaf shell 中添加 属性 :
1/config:edit org.jemz.karaf.tutorial.hello.service.config
2/config:propset <key> <value>
3/ 最后 config:update
将更改保存到文件。
如果您想以编程方式执行此操作,请检查 karaf 源以查看实现
@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();
}
}
因为我的 'update-strategy' 是 reload
我可以在注册新的 ConfigurationAdmin 服务时得到更新。
欢迎对我的方法发表任何评论!