Переменные конфигурации в системе

Конфигурация и взаимодействия с переменными окружения в продуктаю Юниверс организованы следующим образом:

  • Все строковые константы модуля должны быть расположены только в классе ConfigurationConstants. У каждого модуля свой ConfigurationConstants. Например, ClassifiersConfigurationProperty - это ConfigurationProperty для классификаторов.

  • У таких констант конфигурации префикс PROPERTY.

  • Константы строятся по принципу MODULE_ID + ".осмысленное.имя.проперти"

  • В классах ConfigurationProperty модуля, находящимися в том же пакете, где и константы, они ОБЯЗАТЕЛЬНО описываются (даже если переменная для bootstrap, и нужно видеть ее значение на UI). Пример:

/**
* Enable/disable runtime profiler.
* Old:
* name: unidata.simon.enabled
* group: unidata.properties.group.simon
*/
public static final ConfigurationProperty<Boolean> SYSTEM_SIMON_ENABLED = ConfigurationProperty.bool()
    .key(SystemConfigurationConstants.PROPERTY_SIMON_ENABLED)
    .groupKey(SystemConfigurationConstants.PROPERTY_SYSTEM_GROUP)
    .moduleId(SystemModule.MODULE_ID)
    .setter(MeasurementPoint::setEnabled)
    .defaultValue(Boolean.FALSE)
    .readOnly(false)
    .required(false)
    .build();
  • Переменные могут быть любого типа. Но необходимо добавлять serializer/deserializer (и, желательно, валидатор) в строку:

    /**
    * Data dump target format.
    * Old:
    * name: unidata.dump.target.format
    * group: not grouped
    */
    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();
    

Пример ссылки на переменные:

/**
* The default dump target format.
*/
@ConfigurationRef(SystemConfigurationConstants.PROPERTY_DUMP_TARGET_FORMAT)
private ConfigurationValue<DumpTargetFormat> dumpTargetFormat;
  • Переменная не обновляется, если у нее .readOnly(true).

  • Для обновления значения переменной ничего не нужно делать.

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

@Override
public void configurationValueUpdated(ConfigurationProperty<?> p) {

    if (p != CoreConfigurationProperty.CORE_ASYNC_TASK_EXECUTOR_POOL_SIZE) {
        return;
    }

    threadPoolExecutor.setCorePoolSize(poolSize.getValue().intValue());
    threadPoolExecutor.setMaximumPoolSize(poolSize.getValue().intValue());
}
  • Из org.unidata.mdm.system.service.RuntimePropertiesService можно получать значения для любых переменных.

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