Netflix archaius无法读取更新的属性文件值

时间:2016-02-16 22:40:46

标签: java configuration-management netflix apache-commons-config netflix-archaius

我是Netflix archaius的新手。我有一个代码片段,它读取Java属性文件并打印属性值。

当该程序运行时,它会从testproperty.properties文件中打印名为“Fields”的属性值。现在,当这个程序运行时,我正在更新“Fields”属性的值,因此archaius应该动态获取更改值。但它仍然印有较旧的价值。

在这个Java程序中使用archaius的正确方法是什么?或者更新程序中的属性而不重新启动它?如果有人可以在此代码段中指出更正,那将会有所帮助。

我想用Netflix archaius运行一个演示,所以我在项目中通过maven导入了archaius。

现在我正在更新我的属性文件。但它仍打印旧的属性值。 (PS:我在驱动程序中保留了连续的while循环,以查看archaius是否选择了更新属性值运行时。我猜这是archaius想要做的。在不重新启动应用程序的情况下获取更新的属性。如果我错了,请纠正我。)< / p>

以下是我的代码段:

import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicStringProperty;

public class PropertyChangetest {

    public static void main(String args[]) {

        DynamicPropertyFactory sampleProp = DynamicPropertyFactory.getInstance();
        System.setProperty("archaius.configurationSource.defaultFileName", "TestProperty.properties");
        System.setProperty("archaius.fixedDelayPollingScheduler.delayMills", "500");

        while(true) {
            DynamicStringProperty sampleProp1 = sampleProp.getStringProperty("fields","");
            System.out.println(sampleProp1.get());
        }
    }
}

我的“TestProperty.properties”文件只有一个名为fields的属性。运行程序后,我正在更新我的属性文件,但它仍然打印旧值。

1 个答案:

答案 0 :(得分:0)

这个想法是实现一个自定义的PolledConfigurationSource,因此Archaius可以轮询源并更新属性以供使用。我还提供了一个回调,即在没有你的应用程序再次轮询它的情况下使用该属性的智能方法(记住Archaius正在为你做轮询部分)。

示例代码的重要说明:程序在第一次回调后退出。如果要测试更多回调,请在类变量'latch'

处增加计数器
package com.apple.paymentgateway.config;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;

import org.apache.commons.configuration.PropertiesConfiguration;
import org.junit.Test;

import com.netflix.config.AbstractPollingScheduler;
import com.netflix.config.ConcurrentMapConfiguration;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicConfiguration;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicStringProperty;
import com.netflix.config.FixedDelayPollingScheduler;
import com.netflix.config.PollResult;
import com.netflix.config.PolledConfigurationSource;

public class TestArchaius {
    CountDownLatch latch = new CountDownLatch(1);

    @Test
    public void tes() throws Exception {
        AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler(0, 1000, false);
        DynamicConfiguration dynamicConfiguration = new DynamicConfiguration(new MyPolledConfigurationSource(), scheduler);

        ConfigurationManager.install(dynamicConfiguration);

        DynamicStringProperty fieldsProperty = DynamicPropertyFactory.getInstance().getStringProperty("fields", "");
        fieldsProperty.addCallback(() -> {
            System.out.println(fieldsProperty.get());
            latch.countDown();
        });

        latch.await();
    }

    class MyPolledConfigurationSource implements PolledConfigurationSource {

        @Override
        public PollResult poll(boolean initial, Object checkPoint) throws Exception {
            ConcurrentMapConfiguration configFromPropertiesFile = new ConcurrentMapConfiguration(
                    new PropertiesConfiguration("TestProperty.properties"));
            Map<String, Object> fullProperties = new HashMap<String, Object>();
            configFromPropertiesFile.getProperties().forEach((k, v) -> fullProperties.put((String) k, v));
            return PollResult.createFull(fullProperties);
        }

    }
}