以编程方式启动Spring Cloud @RefreshScope刷新

时间:2018-06-22 20:56:35

标签: spring spring-cloud spring-cloud-config

我正在尝试支持管理员在运行时对某些应用程序设置进行更改,并使这些更改立即生效。而是完全重新实现一个自定义配置系统,我想我将利用我们已经获得的Spring配置并使用Spring Cloud Config和@RefreshScope来管理配置重新加载。我已将配置服务器嵌入到应用程序中,设置了bootstrap=true,并配置了一个jdbc后端。我期望的基本情况是,更新数据库中的值并命中/refresh端点。

我现在正尝试通过Web终结点公开修改(某些)属性。控制器与本质上类似的服务实现进行对话:

@Service
class SettingsService(
    private val settingsRepo: SettingsRepository,
    private val refresher: ContextRefresher) {

    fun updateSetting(name: String, value: String) {
        //use settingsRepo to save updated value to db
        contextRefresher.refresh()
    }
}

({ContextRefresher是内置刷新端点实现所使用的同一类)

当调用contextRefresher.refresh()时,线程似乎进入了一个以ConfigFileApplicationListener为中心的无限循环,试图重新加载配置。我不会说我的方法行不通令我感到完全惊讶,但是到目前为止,我一直无法弄清为什么为什么,以及是否有直接的解决方法。

是否有一种方法可以按照我所描述的方式以编程方式刷新配置?我宁愿不必让UI单独调用/refresh(实际上我宁愿完全不必将该端点暴露给外界)。

更新:进一步考虑,从长远来看,仅使用ContextRefresher还是行不通的,因为它不考虑可能存在的任何其他应用程序实例运行。为了解决这个问题,我希望我将集成Spring Cloud Bus,这时我希望将适当的消息发布到总线上会刷新所有节点的配置,并且回避我遇到的根本问题是。不过,我还没有机会尝试一下。

0 个答案:

没有答案