我是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的属性。运行程序后,我正在更新我的属性文件,但它仍然打印旧值。
答案 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);
}
}
}