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

时间:2019-05-08 17:35:28

标签: java spring-boot redis lua application.properties

我希望能够检查Redis集群中是否存在脚本。如果没有,我将需要从resources folder加载新脚本并保存该新脚本的相应SHA值。我想在下次启动应用程序时在application.properties内保存该SHA值。理想情况下,可以通过覆盖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仅添加一行?

2 个答案:

答案 0 :(得分:1)

无需在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;
}

答案 1 :(得分:0)

您可以将配置外部化到类路径之外的文件夹中。

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

SpringApplication在以下位置从application.properties文件加载属性,并将其添加到Spring Environment:

     
      
  1. 当前目录的config子目录
  2.   
  3. 当前目录
  4.   
  5. 类路径/ config包
  6.   
  7. classpath根
  8.   
     

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

     

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

Externalized Configuration