如何在运行时编辑 application.properties(下次使用)

我想能够检查 Redis 集群中是否存在脚本。如果不存在,我将需要从我的 resources folder 加载新的脚本并保存相应的 SHA 值。我希望将该 SHA 值保存到 application.properties 中,以便下次应用程序启动时使用。这最好是通过覆盖以前的 SHA 值条目来完成

我知道在启动期间只读取一次属性文件,但这并不重要,因为我只想将 SHA 值保存到 application.properties 以备下次使用,即避免每次都检查脚本和加载的开销。

这是我准备脚本的方法

static String prepareScripts() throws ExecutionException, InterruptedException, IOException {
    List <Boolean> list = (List) asyncCommands.scriptExists(sha).get();
    shaDigest = sha;
    if (list.get(0) == false) {
        URL url = AbstractRedisDao.class.getClassLoader().getResource("script.txt");
        File file = new File(url.getPath());
        String str = FileUtils.readFileToString(file, "ISO_8859_1");
        shaDigest = (String) asyncCommands.scriptLoad(str).get();

        Properties  properties = new Properties();

        try {
            FileWriter writer = new FileWriter("application.properties");
            BufferedWriter bw = new BufferedWriter(writer);
            Iterator propertyIt =  properties.entrySet().iterator();

            while (propertyIt.hasNext() ) {
                Map.Entry nextHolder = (Map.Entry) propertyIt.next();
                while (nextHolder.getKey() != ("redis.scriptActiveDev")) {
                    bw.write(nextHolder.getKey() + "=" + nextHolder.getValue());
                }
            }

            bw.write("redis.scriptActiveDev=" + shaDigest);
        } catch (IOException e) {
            System.err.format("IOException: %s%n", e);
        }
        return shaDigest;
    } else {
        return shaDigest;
    }
}

这是 application.properties 中 Redis 的详细信息:

redis.enabled=true
redis.hostname=xxxx
redis.port=xxxx
redis.password=xxxx
redis.sha=xxxx

我是否走在正确的轨道上?另外,我如何在重建具有新属性的整个 application.properties 后将其保存回 resources 文件夹中?有没有更有效的方法来做到这一点,而不是创建整个 application.properties 来添加一行?

点赞
用户6499075
用户6499075

你可以将配置文件存储在classpath之外的文件夹中。

 java -jar myproject.jar --spring.config.location=/var/config

SpringApplication 从以下位置的application.properties文件中加载属性,并将它们添加到Spring环境中:

  1. 当前目录下的config子目录
  2. 当前目录
  3. classpath /config包
  4. classpath 根目录

列表按优先顺序排列(在较低位置定义的属性会被较高位置的属性覆盖)。

如果你不喜欢application.properties作为配置文件名,你可以通过指定spring.config.name环境属性切换到其他文件名。你还可以通过spring.config.location环境属性(一个逗号分隔的目录位置或文件路径列表)来引用明确的位置。

外部化配置

2019-05-08 17:49:05
用户4337243
用户4337243

application.properties 中无需存储 Lua 脚本的 SHA 摘要。

在应用程序启动时使用 Redis 客户端的 API 获取 SHA 摘要。

例如,Lettuce 提供以下 API 用于脚本:

String digest(V script)

String scriptLoad(V script)

List<Boolean> scriptExists(String... digests)

您可以在每次应用程序启动时执行以下代码以获取脚本的摘要:

public String sha(String script) {
  String shaDigest = redisScriptingCommands.digest(script);
  boolean scriptExists = redisScriptingCommands.scriptExists(shaDigest).get(0);
  if (!scriptExists) {
    redisScriptingCommands.scriptLoad(script);
  }
  return shaDigest;
}
2019-05-08 18:07:40