我正在尝试支持管理员在运行时对某些应用程序设置进行更改,并使这些更改立即生效。而是完全重新实现一个自定义配置系统,我想我将利用我们已经获得的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,这时我希望将适当的消息发布到总线上会刷新所有节点的配置,并且回避我遇到的根本问题是。不过,我还没有机会尝试一下。