Java Spring Boot: перезагрузить конфигурацию без весеннего облачного сервера конфигурации - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь перезагрузить конфигурацию моего приложения во время выполнения.Конфигурация находится в файле yaml, и привязка с @ConfigurationProperties работает как положено.Следующая вещьЯ хочу перезагрузить конфиг, когда yaml изменился.Или, скорее, я проверяю с помощью @Scheduled, изменился ли файл.

Я бы хотел избежать запуска второго сервера для моего обновления Environment.У меня есть два вопроса:

  1. Как мне обновить среду, ConfigurableEnvironment возможно?
  2. Как мне их распространить?

Spring cloudСостояния документации конфигурации:

EnvironmentChangeEvent охватывает большой класс случаев использования обновления, если вы действительно можете внести изменения в Environment и опубликовать событие (эти API являются открытыми ичасть ядра Spring)

Итак, публикация события работает, но я не понимаю, как на самом деле обновить свойства.

1 Ответ

0 голосов
/ 15 декабря 2018

Существует довольно широкое обсуждение этого вопроса: как обновить свойства без какого-либо сервера конфигурации.На этом здесь есть пост Дейва Сайера, который дает некоторый свет - но все еще не говорит о себе.

Наиболее естественным подходом для spring-boot / -cloud будет следующий (как обсуждено на github-config-cloud-cloud ):

@Component
@ConfigurationProperties("ignored")
@RefreshScope
public class Config {
    private List<String> path;

    public List<String> getPath() {
        return path;
    }

    public void setPath(List<String> path) {
        this.path = path;
    }
}

Это не такt работает из-за некоторых проблем с прокси между @RefreshScope и @ConfigurationProperties - обе аннотации приводят к тому, что прокси-компоненты bean не соответствуют друг другу.

Поэтому я начал смотреть на это с точки зрения весны.PropertySources доступны через Environment, поэтому вы можете получить к ним доступ и изменить их с помощью

final String propertySourceName = "externalConfiguration"; 
// name of propertySource as defined by 
// @PropertySource(name = "externalConfiguration", value = "${application.config.location}")
ResourcePropertySource propertySource = new ResourcePropertySource(propertySourceName, new FileSystemResource(file));
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.replace(propertySourceName, propertySource);

Мой пример использования был основан на «редактировании пользователем файла», поэтому обновленные свойства основывались на FileSystemWatcher, который изменялpropertySources.Для того чтобы исходные тексты были правильно загружены компонентом конфигурации, область действия компонента должна была быть прототипом - корректно перестраиваться при каждом вызове.

Полный пример доступен в виде гистограммы .Конфиг-сервер не включен вообще.Надеюсь, это поможет

...