我目前正在设置一个Spring Cloud配置服务器,以使用RabbitMQ将更改事件传播到客户端,从特定存储库中提供一些JSON配置文件。
因此,我添加了一个REST终结点,该终结点基于传递的分支名称提供所有配置文件:
@RestController
public class RPConfigsEndpoint {
@Autowired
private JGitEnvironmentRepository repository;
private File[] files;
@RequestMapping(value = "/myConfigs")
public File[] getList(@RequestParam(defaultValue = "master") String branch) {
//load/refresh the branch
repository.refresh(branch);
try {
FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repo = builder.setGitDir(repository.getBasedir()).readEnvironment().findGitDir().build();
//only return JSON files
files = repo.getDirectory().listFiles((file, s) -> {
return s.toLowerCase().endsWith(".json");
});
} catch (IOException e) {
e.printStackTrace();
}
return files;
}
}
按预期,我将所有文件都转换为纯文本文件...到目前为止,一切都很好。
现在我的问题:
如果我修改这些文件之一并触发服务器上的'/monitor'
端点,它会按预期生成RefreshEvent:
.c.s.e.MultipleJGitEnvironmentRepository : Fetched for remote master and found 1 updates o.s.cloud.bus.event.RefreshListener : Received remote refresh request. Keys refreshed []
发送此事件,因为服务器注意到提交ID已更改。 刷新键的增量为空,因为它仅查找环境属性(在.yml或.properties文件中)。
有没有一种方法可以像使用单个属性那样在客户端重新加载整个配置文件?因此,我需要调整变更通知吗?
使用当前的方法,我将不得不重新加载整个分支(40个文件),而不是仅重新加载修改后的文件...
我在github上找到了与2016年类似的问题,但没有找到答案。
预先感谢您的提示。
更新
repository.findOne(...)
和repository.refresh(...)
都不是线程安全的,因此必须在云环境中保证,因为该服务可以同时由不同的应用程序联系。
可能的解决方案:
“同步”相关的方法调用
避免列出所有文件,并请求单个纯文本文件,因为它开箱即用。