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

Posted

技术标签:

【中文标题】如何在运行时编辑 application.properties(以备下次使用)【英文标题】:How to edit application.properties during runtime (for next time use) 【发布时间】:2019-09-26 12:17:42 【问题描述】:

我希望能够检查 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 只是添加一行?

【问题讨论】:

【参考方案1】:

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

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

例如,Lettuce 为脚本提供以下API:String digest(V script)String scriptLoad(V script)List&lt;Boolean&gt; 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;

【讨论】:

【参考方案2】:

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

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

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

    当前目录的配置子目录 当前目录 类路径 /config 包 类路径根

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

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

Externalized Configuration

【讨论】:

以上是关于如何在运行时编辑 application.properties(以备下次使用)的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时编辑 Maven POM?

如何仅在 Unity 编辑器启动时运行脚本?

如何使用 Ace 代码编辑器在运行时添加新的突出显示规则?

运行 R Shiny 应用程序时如何在数据表函数中编辑列名?

如何在 Unity 编辑器中运行两个游戏窗口

进程以退出代码 1 Spring Boot Intellij 结束