gpt4 book ai didi

Java Spring 启动 : Reload config without spring cloud config server

转载 作者:行者123 更新时间:2023-11-30 10:15:45 25 4
gpt4 key购买 nike

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

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

  1. 我该如何更新环境,ConfigurableEnvironment 也许?
  2. 我如何传播这些?

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 代理彼此不一致。

因此我开始从spring的角度来看待它。可通过 Environment 访问 propertySources,因此您可以通过以下方式访问和修改它们

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 的范围需要是一个原型(prototype)——以便在每次调用时正确重建。

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

关于Java Spring 启动 : Reload config without spring cloud config server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50364054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com