Java 如何在运行时编辑application.properties(供下次使用)
我希望能够检查Redis集群中是否存在脚本。如果没有,我将需要从我的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
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环境中:
无需在
应用程序.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;
}