在Karaf 3.0.5中使用cm:managed-properites进行动态配置加载

时间:2016-05-09 06:06:35

标签: osgi karaf blueprint-osgi

我有一个简单的Camel Application捆绑包,它将在Apache Service Mix 6.1下部署在Karaf 3.0.5中。配置文件放在etc /目录中(让我们说它被命名为wf.cfg)。我想在我的应用程序包中拥有动态配置更改功能。因此,无论何时在wf.cfg中更改某些内容,它都可以立即打包。为此,我在blueprint.xml中添加了以下内容

<bean id="configBean"   class="com.jabong.orchestratorservice.basecomponent.config.ConfigBean">
        <cm:managed-properties persistent-id="wf" update-method="refresh" update-strategy="component-managed"/>
    </bean>

public class ConfigBean {
     private String env;
     public String getEnv() {
         return env;
     }
     public void setEnv(String env) {
        this.env = env;
     }
     public void refresh() {
         System.out.println("Config refreshed");
     }
}

但每当我更新wf.cfg文件时,都不会调用ConfigBean类中的refresh方法。

我甚至尝试过使用托管服务工厂。

<cm:managed-service-factory id="managed-service-factory"                                factory-pid="wf"                            interface="com.jabong.orchestratorservice.basecomponent.config.ConfigBean"> 
<cm:managed-component class="com.jabong.orchestratorservice.basecomponent.config.ConfigBean">
            <cm:managed-properties persistent-id="" update-strategy="component-managed" update-method="refresh" />
</cm:managed-component>
    </cm:managed-service-factory>

但它没有帮助。有人可以帮我解决这个问题。

请注意:我不想使用cm:property-placeholder,因为它会在我们更改cfg文件时重新加载完整的上下文。我想只使用cm:managed-properties。

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。

刷新方法应该有一个参数Map<String, String> properties

public class ConfigBean {
     private String env;
     public String getEnv() {
         return env;
     }
     public void setEnv(String env) {
        this.env = env;
     }
     public void refresh(Map<String, String> properties) {
         System.out.println("Config refreshed");
     }
}