Переменные конфигурации в системе¶
Конфигурация и взаимодействия с переменными окружения в продуктаю Юниверс организованы следующим образом:
Все строковые константы модуля должны быть расположены только в классе
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) в момент вставки значения. Это нужно учитывать.