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 или блокнота, измените значение конфигурации и сохраните файл. Вы можете увидеть, как код печатает последнее значение конфигурации после установки времени.

Другие вопросы по тегам