如何在运行时编辑 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<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;
【讨论】:
【参考方案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(以备下次使用)的主要内容,如果未能解决你的问题,请参考以下文章