Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时编辑application.properties(供下次使用)_Java_Spring Boot_Redis_Lua_Application.properties - Fatal编程技术网

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

Java 如何在运行时编辑application.properties(供下次使用),java,spring-boot,redis,lua,application.properties,Java,Spring Boot,Redis,Lua,Application.properties,我希望能够检查Redis集群中是否存在脚本。如果没有,我将需要从我的resources文件夹加载一个新脚本,并保存该新脚本的相应SHA值。我想在application.properties中保存该SHA值,以便下次启动应用程序时使用。理想情况下,可以通过覆盖sha值的前一个条目来实现 我知道属性文件在启动期间读取一次,但这并不重要,因为我只想将该SHA值保存到应用程序.properties以供下次使用,即防止每次检查脚本和加载的开销 这是我准备脚本的方法 static String prepar

我希望能够检查Redis集群中是否存在脚本。如果没有,我将需要从我的
resources文件夹
加载一个新脚本,并保存该新脚本的相应SHA值。我想在
application.properties
中保存该SHA值,以便下次启动应用程序时使用。理想情况下,可以通过覆盖sha值的前一个条目来实现

我知道属性文件在启动期间读取一次,但这并不重要,因为我只想将该SHA值保存到
应用程序.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;
    }
}

这条路对吗?另外,在使用新属性重新构建
应用程序.properties
文件夹后,如何将其保存回
资源
文件夹?是否有一种更有效的方法可以做到这一点,而无需重新创建整个
应用程序.properties
,只需添加一行?

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

 java -jar myproject.jar --spring.config.location=/var/config
SpringApplication从以下位置的application.properties文件加载属性,并将其添加到Spring环境中:

  • 当前目录的配置子目录
  • 当前目录
  • 类路径/配置包
  • 类路径根
  • 列表按优先级排序(在列表中较高位置定义的特性将覆盖在较低位置定义的特性)

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


    无需在
    应用程序.properties
    中存储Lua脚本的SHA摘要

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

    例如,莴苣为脚本编写提供了以下功能:
    字符串摘要(V脚本)

    字符串脚本加载(V脚本)

    列表脚本存在(字符串…摘要)

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

    public String sha(String script) {
      String shaDigest = redisScriptingCommands.digest(script);
      boolean scriptExists = redisScriptingCommands.scriptExists(shaDigest).get(0);
      if (!scriptExists) {
        redisScriptingCommands.scriptLoad(script);
      }
      return shaDigest;
    }
    
    public String sha(String script) {
      String shaDigest = redisScriptingCommands.digest(script);
      boolean scriptExists = redisScriptingCommands.scriptExists(shaDigest).get(0);
      if (!scriptExists) {
        redisScriptingCommands.scriptLoad(script);
      }
      return shaDigest;
    }