Конфигурация микропрофиля с использованием динамических конфигурационных ключей

В настоящее время я ищу способ динамической сборки конфигурационных ключей (резервная обработка), а затем ищу их в наших файлах microprofile-config.properties. Такой файл может выглядеть так:

# customer fallbacks

my.config=1234                            # use this fallback when there is no customer
customer2.my.config=12345                 # use this fallback when there is no subcustomer
customer2.subCustomer1.my.config=123456   # first level

Итак, когда есть клиент и субклиент, используйте on

Причина, по которой у меня возникла эта проблема, заключается в том, что я хотел бы использовать аннотацию @ConfigProperty, поэтому нет ConfigProvider.getConfig(). Это означает, что мне придется собрать свой динамический ключ конфигурации внутри моего пользовательского файла ConfigSource.

Я знаю, что ConfigSources загружаются при запуске сервера через ServiceLoader. Поэтому я попытался удалить существующую конфигурацию и заменить ее моей пользовательской конфигурацией:

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.spi.ConfigProviderResolver;

@Startup
@Singleton
public class StartupConfigurationRegistrar{

@PostConstruct
private void registerConfig() {
        final Config customConfig = ConfigProviderResolver.instance().getBuilder().withSources(new FallbackHandlingConfiguration(myReqiredVariables)).addDefaultSources().build();
        ConfigProviderResolver.instance().releaseConfig(ConfigProviderResolver.instance().getConfig());
        ConfigProviderResolver.instance().registerConfig(customConfig, Thread.currentThread().getContextClassLoader());
    }
}

Мой ConfigSource добавлен правильно. Но позже, когда я попытаюсь получить доступ к конфигурации в другом классе, мой пользовательский ConfigSource исчез, и остались только три источника конфигурации по умолчанию. Я думаю, что это может быть проблема ClassLoader.

Любые идеи, как получить динамические значения внутри ConfigSource?


person sofarsoghood    schedule 07.09.2018    source источник


Ответы (1)


У вас небольшое неправильное представление о ConfigBuilder. Если вы используете это для создания Config, вам придется передавать его вручную.

Но большую часть времени вы обычно используете наш режим «автоматического обнаружения». Это работает со стандартным механизмом java.util.ServiceLoader. Это описано в спецификации PDF, а также в JavaDocs: https://github.com/eclipse/microprofile-config/blob/master/api/src/main/java/org/eclipse/microprofile/config/spi/ConfigSource.java#L64

Но я бы предпочел не иметь ConfigSource с динамическими значениями, потому что это может вызвать проблемы при высокой параллельной нагрузке. Вы могли бы лучше взглянуть на механизм addLookupSuffix, который мы предложили для ConfigJSR и прямо сейчас переносим обратно на mp-config: https://github.com/eclipse/ConfigJSR/blob/master/api/src/main/java/javax/config/ConfigAccessor.java#L191

Это похоже на ваши первоначальные мысли, но .customer2 будет суффиксом ключа конфигурации. чт.

person struberg    schedule 11.03.2019