Netflix archaius не может прочитать обновленное значение файла свойств
Я очень плохо знаком с Netflix archaius. У меня есть фрагмент кода, который читает файл свойств Java и печатает значение свойства.
Когда эта программа запускается, она печатает значение свойства "Поля" из файла testproperty.properties. Теперь, когда эта программа запущена, я обновляю значение свойства "Fields", поэтому archaius должен извлекать измененное значение динамически. Но это все еще печатает старое значение.
Как правильно использовать archaius с этой Java-программой? Или обновить свойства в программе, не перезапуская ее? Если кто-то может указать на исправление в этом фрагменте кода, это будет полезно.
Я хочу запустить демо с Netflix archaius, поэтому я импортировал archaius через maven в свой проект.
Сейчас я обновляю свой файл свойств. Но все же он печатает старое значение свойства. (PS: я сохранил непрерывный цикл while в программе драйвера, чтобы увидеть, выбирает ли archaius время выполнения значения свойства update. Я предполагаю, что это то, что предполагается сделать архаием. Получение обновленного свойства без перезапуска приложения. Исправьте меня, если я ошибаюсь.)
Ниже приведен мой фрагмент кода:
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" имеет только одно свойство, называемое полями. После запуска программы я обновляю свой файл свойств, но он все еще печатает старое значение.
3 ответа
Недавно я столкнулся с этой проблемой. Я хотел реализовать вариант использования, например, свойство DynamicPropertyFactory должно быть обновлено через запрос REST API. Я много гуглил, как это сделать, так как свойство не обновлялось после использования.setProperty(String prop, String value)
метод. Но я обнаружил, что если свойство не определено ранее, оно добавляется с помощью этого метода. Таким образом, проблема сводится к тому, что невозможно переопределить свойство. Также я обнаружил, что он используетConcurrentCompositeConfiguration
для экземпляра Config, а не дляConcurrentMapConfiguration
. Когда я погуглил, нашел сообщения tabnine и обнаружил, что есть метод, называемый
setOverrideProperty(java.lang.String key, java.lang.Object finalValue)
Override the same property in any other configurations in the list.
Таким образом, приведение к этому классу, устанавливающее свойство переопределения, решило проблему. Свойство успешно обновлено.
#Ссылка на ConcurrentCompositeConfiguration — http://netflix.github.io/archaius/archaius-core-javadoc/com/netflix/config/ConcurrentCompositeConfiguration.html
Идея состоит в том, чтобы реализовать пользовательский 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);
}
}
}
Вероятная причина его сбоя заключается в том, что вы использовали IDE для изменения файла конфигурации, вы не знаете, когда ide действительно записывает изменения в файл и сохраняет (конечно, вы можете изменить настройки ide). попробуйте открыть файл конфигурации с помощью другого программного обеспечения, например, блокнота Windows или блокнота, измените значение конфигурации и сохраните файл. Вы можете увидеть, как код печатает последнее значение конфигурации после установки времени.