当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud Gateway:执行器刷新不会重新加载属性

金嘉
2023-03-14

实际上,我正在与Spring Cloud Gateway合作一个项目。

我有一个配置类,它从一个定制的PropretySourceFactory获取其属性。我想对属性进行热重新加载,所以我调用了actuator/refresh(curl-localhost:8080/actuator/refresh-d{}H“Content-Type:application/json”),但它不会重新加载我的配置属性。没有错误或异常。

这是配置类:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;


@Configuration
@ConfigurationProperties
@PropertySource(value="", factory=NatsPropertySourceFactory.class)
public class NatsConfiguration {
    private String apiKey;
    private String apiKeyConsumer;
    private String apiKeyValidity;
    private String apiKeyCreation;
    private int ratelimitMaxTokens;
    private int ratelimitReplenishFrequency;
    private int ratelimitReplenishRate;

    // Getters and setter
    //...
}

PropertySource上的值为空,因为我不会从文件中获取配置,而是从html" target="_blank">消息队列中获取配置。

和NatsPropertySourceFactory:

public class NatsPropertySourceFactory implements PropertySourceFactory{

    final private NatsConfigurationService natsConfigurationService = new NatsConfigurationServiceImpl();

    @Override
    public PropertySource<?> createPropertySource(String arg0, EncodedResource arg1) throws IOException {
        MapPropertySource result = null;
        Logger log = LoggerFactory.getLogger(this.getClass());
        try {
            result = new MapPropertySource("nats", natsConfigurationService.getConfiguration());

        } catch (ConfigurationException e) {
            log.error("RECUPERATION DE CONFIGURATION DEPUIS NATS EN ERREUR", e);
            System.exit(1);
        }
        return result;
    }
    
}

我的属性不与@Value一起使用,所以我不需要@Re鲜Scope。当我调用时 /actuator/refresh不会重新创建NatsConfiguration类。

关于信息,我使用webflux和SpringSecurity(启动器URL是允许的:路径匹配器(“/actuator/**”)。permitAll())

@EnableWebFluxSecurity
@EnableWebFlux
public class SecurityConfiguration implements WebFluxConfigurer {

我哪里错了?

共有1个答案

柳星晖
2023-03-14

顺便说一句,我发现了/actuator/refresh的确切行为:它重新实例化@Configuration类,但对PropertySourceFactory没有任何作用。

我找到了一个解决方法:我创建了一个REST控件,它调用属性源工厂的createProperty tySource方法,然后调用 /actuator/refreshurl。它完全符合我的要求:@Configuration类是最新的,具有属性源工厂给出的新属性。

 类似资料:
  • 问题内容: 这是一个非常基本的问题-但我无法通过在线搜索找到答案。 我正在使用python控制ArcGIS,并且有一个简单的python脚本,该脚本调用了一些预先编写的代码。 但是,当我对预写代码进行更改时,它似乎没有导致任何更改。我导入了此模块,并尝试刷新它,但是没有任何反应。 我什至将它调用的文件移到了另一个位置,脚本仍然可以正常工作。昨天我做的一件事是我将所有python文件都添加到sys路

  • vue2开发 需求是没间隔多上时间请获取一次token、token是10分钟有效、我需要在7分钟的时候刷新一次token、然后我使用的是setInterval()方法 没7分钟请求一次, 但是出现的问题是、页面刷线以后setInterval()方法又重新执行了一次、导致没有正常刷新token 如何解决setInterval页面刷新以后不再重新执行 或者利用其他方法

  • 问题内容: 我正在尝试实现一些功能,即单击屏幕上的按钮将导致我的[QuerydataTable刷新(因为自创建dataTable以来服务器端数据源可能已更改)。 这是我所拥有的: 但是当我运行它时,它什么也没做。单击按钮时刷新dataTable的正确方法是什么?提前致谢! 问题答案: 您可以尝试以下方法:

  • 问题内容: 我正在使用Java进行项目,因此需要在单击特定按钮后重新加载整个程序。这该怎么做? 问题答案: 尝试 如果仍然无法使用,请在完成上述步骤后尝试

  • 问题内容: 我在一个选项卡中有一个数据表,该表是从索引方法上的控制器发送的数据中加载的。 我有加载数据表的视图 然后在加载页面时在javascript中加载数据表 我也有删除功能。如何在不重新加载页面的情况下重新加载数据(使用Ajax从控制器再次获取数据)? 问题答案:

  • 我有一个使用自由服务器运行的微服务。我有一组配置属性,这些属性不能直接使用@Value或@ConfigurationProperties或@Configuration使用。 属性结构: 我有申请。yml组件 和引导。属性为 现在我已经实现了一个配置服务器,它正在从git repo读取属性文件。配置文件结构: appname-dev.yml 在客户端中,我配置了引导。yml组件 每当我更新git r