【问题标题】:How to load changed environment variable in spring boot application running in PCF without restarting application?如何在不重新启动应用程序的情况下在 PCF 中运行的 Spring Boot 应用程序中加载更改的环境变量?
【发布时间】:2020-02-27 03:39:42
【问题描述】:

我们有一个在 PCF 中运行的 Spring Boot 应用程序,它从应用程序中读取 PCF 环境变量(CF_INSTANCE_INDEX、CF_INSTANCE_ADDR、..)。基于这些变量,我们正在尝试实现调度程序的逻辑。在运行此调度程序时,这些变量的值可能已更改。有没有办法在运行时刷新/重新加载具有 env 值的 bean?

我们在配置属性 bean 上使用了 @RefreshScope 注释。

@Configuration
@RefreshScope
public class PcfEnvProperties{

@Value("${CF_INSTANCE_INDEX}")
private int intanceIndex;

@Value("${CF_INSTANCE_ADDR}")
private String intanceAddr;

...
}

并使用刷新

context.getBean(RefreshScope.class).refresh("PcfEnvProperties");
PcfEnvProperties pcfEnv = context.getBean(PcfEnvProperties.class);

但它不会将最近更改的环境变量加载到正在运行的应用程序中。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: java spring spring-boot pcf


    【解决方案1】:

    您可以将 Spring Cloud Config ServerSpring Actuator 结合使用,在您的服务中公开一个端点,该端点将即时刷新应用程序的属性。您可以将调度程序设置为在计时器上或根据需要访问此端点。

    这是我发现的一个看起来很简单的教程:https://jeroenbellen.com/manage-and-reload-spring-application-properties-on-the-fly/

    您可能需要根据平台的配置方式来进行设置,但我相信它应该可以满足您的需求。我们已经使用这种执行器/配置服务器方法在我们的 PCF 平台上部署了许多 Java Web 服务,我们只需调用刷新端点,它就会成功地从配置服务器中拉入(并在必要时覆盖)新的属性和值.您还可以从响应中提取更改的属性名称和值的列表。

    我不熟悉您提到的特定属性值,但只要它们通常是 Spring 的 ApplicationContext 的一部分(通常可以在其中找到属性),那么您应该能够使用 Spring 的这种方法提取更改的值云配置服务器和执行器库。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 2021-11-15
      • 2018-09-07
      • 2020-02-23
      • 2021-10-13
      • 2019-12-15
      • 2019-09-17
      • 1970-01-01
      相关资源
      最近更新 更多