编程语言
首页 > 编程语言> > Java Spring Boot:无需Spring Cloud配置服务器即可重新加载配置

Java Spring Boot:无需Spring Cloud配置服务器即可重新加载配置

作者:互联网

我正在尝试在运行时重新加载应用程序的配置.配置位于yaml文件中,并且与@ConfigurationProperties的绑定按预期进行.接下来是. yaml更改后,我想重新加载配置.或者更确切地说,我正在与@Scheduled检查文件是否已更改.

我想避免运行第二台服务器来更新我的环境.我有两个问题:

>如何更新环境,也许是ConfigurableEnvironment?
>如何传播这些?

Spring Cloud配置文档说明:

The EnvironmentChangeEvent covers a large class of refresh use cases, as long as you can actually make a change to the Environment and publish the event (those APIs are public and part of core Spring)

因此,发布事件是可行的,但是我不了解如何实际更新属性.

解决方法:

关于这一点,有很多讨论:如何在没有任何配置服务器的情况下刷新属性.在here上有一个Dave Syer帖子,可以带来一些启发-但仍然不言自明.

对于spring-boot / -cloud最自然的方法如下(如on spring-cloud-config github所述):

@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;
    }
}

由于@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发生了变化.为了使配置Bean正确提取源,该Bean的范围需要是一个原型-在每次调用时都正确地重建.

完整的示例是available as a gist.不包含任何配置服务器.希望能有所帮助

标签:java,spring,spring-boot,spring-cloud
来源: https://codeday.me/bug/20191013/1905671.html