Создание и управление параметрами конфигурации в системе

Статья содержит информацию о создании, использовании и управлении параметрами конфигурации в системе Universe.

Параметры конфигурации загружаются в память при старте контекста Spring с использованием сервиса RuntimePropertiesService из файла backend.properties.

Имя параметра формируется как Module.ID + .name.props.

Класс ConfigurationProperty<T>

Параметр конфигурации - это экземпляр класса ConfigurationProperty.

В системе поддерживаются параметры следующих типов:

  • string - для строковых значений (String)

  • integer - для целых чисел (Long)

  • number - для чисел с плавающей точкой (Double)

  • bool - для булевых значений (Boolean)

  • clob - для больших текстовых данных (String)

  • custom - пользовательски тип, подробнее ниже

Экземпляр класса ConfigurationProperty создается через ConfigurationPropertyBuilder с помощью методов:

  • ConfigurationProperty.string()

  • ConfigurationProperty.integer()

  • ConfigurationProperty.number()

  • ConfigurationProperty.bool()

  • ConfigurationProperty.clob()

  • ConfigurationProperty.custom()

Для создания экземпляра ConfigurationProperty необходимы следующие поля:

  • key - Ключ параметра, который идентифицирует настройку.

  • moduleId - Идентификатор модуля, к которому принадлежит настройка.

  • propertyType - Проставляется в момент создания билдера ConfigurationProperty.string().

Поля для группировки и сортировки:

  • groupKey;

  • groupId.

Управление параметрами:

  • required свойство должно быть обязательно задано на момент старта системы (default value или в backend.properties).

  • readOnly флаг - это параметр только для чтения и не может быть изменен в процессе работы.

  • publicProperty

  • defaultValue - значение по умолчанию.

  • Predicate<Optional<String>> validator - предикат для проверки значения свойства в момент установки.

Если тип параметра конфигурации - CUSTOM, то дополнительно необходимы поля:

  • deserializer (Свойство) - Функция для десериализации значения свойства. Обязательно для свойств с пользовательским типом (тип ConfigurationPropertyType.CUSTOM).

  • serializer - если свойство не только для чтения (readOnly равно false).

public static final ConfigurationProperty<DumpTargetFormat> SYSTEM_DUMP_TARGET_FORMAT = ConfigurationProperty.custom(DumpTargetFormat.class)
    .key(SystemConfigurationConstants.PROPERTY_DUMP_TARGET_FORMAT)
    .groupKey(SystemConfigurationConstants.PROPERTY_SYSTEM_GROUP)
    .moduleId(SystemModule.MODULE_ID)
    .deserializer(DumpTargetFormat::fromValue)
    .serializer(DumpTargetFormat::name)
    .defaultValue(DumpTargetFormat.PROTOSTUFF)
    .readOnly(true)
    .required(true)
    .build();

Пример использования

Пример соответствует проекту HelloUniverse, модуль SDKSpringModule.

В статье упоминаются классы и файлы:

  • SDKSpringModuleConfigurationConstants

  • SDKSpringConfigurationProperty

  • SDKSpringModule

  • resources/sdk_spring_messages_ХХ.properties, где XX - локализация ru/en/и т.д.

Создание переменной

Все строковые константы находятся в SDKSpringModuleConfigurationConstants.class.

  1. Задайте константу в классе SDKSpringConfigurationProperty:

/**
 * Пользовательская настройка
 * </br>
 * Есть возможность добавить локализацию для этой настройки: добавить в resources/sdk_spring_messages_en
 * .properties и resources/sdk_spring_messages_ru.properties
 */
public static final String PROPERTY_AUTH_LOGGING_ENABLE = SDKSpringModule.MODULE_ID + ".auth.log.enable";
public static final ConfigurationProperty<Boolean> AUTH_LOGGING_ENABLE = ConfigurationProperty.bool()
    .key(SDKSpringModuleConfigurationConstants.PROPERTY_AUTH_LOGGING_ENABLE)
    .groupKey(SDKSpringModuleConfigurationConstants.PROPERTY_SDK_SPRING_DEFAULT_GROUP)
    // Для модуля возможно задать порядок отображения настроек на ui. По умолчанию Integer.MAX_VALUE
    //.groupId(1001)
    .moduleId(SDKSpringModule.MODULE_ID)
    .defaultValue(false)
    //.deserializer(t -> deserialize(t))
    //.serializer(t -> serializer(t))
    //.validator(t -> t.isPresent() && Integer.parseInt(t.get()) < 2 )
    .readOnly(false)
    .required(true)
    .build();
private static final ConfigurationProperty<?>[] VALUES = {
        AUTH_LOGGING_ENABLE
};


public static ConfigurationProperty<?>[] values() {
    return VALUES;
}
  1. Задайте локализацию в файлах resources/sdk_spring_messages_ru.properties и resources/sdk_spring_messages_en.properties:

com.universe.mdm.sdk.spring.auth.log.enable = Вывод в лог результат авторизации
  1. Подключите настройки в классе SDKSpringConfigurationProperty:

@Override
public ConfigurationProperty<?>[] getConfigurationProperties() {
    return SDKSpringConfigurationProperty.values();
}

Подключение переменной

@ConfigurationRef(SDKSpringModuleConfigurationConstants.AUTH_LOGGING_ENABLE)
private ConfigurationValue<Boolean> authLoggingEnable;

Обновление перемененной

Для обновления значения переменной действия не требуются.

Если после обновления значения требуется реакция/интервенция, то необходимо имплементировать org.unidata.mdm.system.type.configuration.ConfigurationValueUpdatesListener.configurationValueUpdated(ConfigurationProperty<?>) тем же бином, который содержит ссылку на переменную.

@Override
public void configurationValueUpdated(ConfigurationProperty<?> property) {
    if (property == SDKSpringConfigurationProperty.AUTH_LOGGING_ENABLE) {
        // Отправка электронного сообщения администратору
    }
}
  • Переменная не обновляется, если у нее .readOnly(true).

Примечания

  • Если переменная описана как ConfigurationProperty<Long>,, и на нее есть ссылка в коде как на ConfigurationValue<Boolean>, то вы получите CCE (ClassCastException) в момент вставки значения.

  • Из org.unidata.mdm.system.service.RuntimePropertiesService можно получать значения для любых переменных.

  • Настройки могут быть заданы через @Value(), но это не рекомендуется.