Как редактировать application.properties во время выполнения (для следующего использования) - PullRequest
0 голосов
/ 08 мая 2019

Я хочу иметь возможность проверить, существует ли сценарий в кластере Redis.Если этого не произойдет, мне нужно будет загрузить новый скрипт из моего resources folder и сохранить соответствующее значение SHA этого нового скрипта.Я хотел бы сохранить это значение SHA для следующего запуска приложения, внутри application.properties.В идеале это можно сделать, переписав предыдущую запись для значения ша

. Я знаю, что файл свойств читается один раз при запуске, но это не имеет значения, поскольку я хочу сохранить это значение SHA только в * 1005.* для использования в следующий раз, т.е. для предотвращения накладных расходов на проверку скрипта и загрузку каждый раз.

Это мой метод для подготовки скриптов

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.enabled=true
redis.hostname=xxxx
redis.port=xxxx
redis.password=xxxx
redis.sha=xxxx

Это на правильном пути?Кроме того, как я могу сохранить application.properties обратно в папку resources после перестроения его с новым свойством?Есть ли более эффективный способ сделать это без воссоздания всего application.properties только для добавления одной строки?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Нет необходимости хранить дайджесты SHA для сценариев Lua в application.properties.

Используйте API вашего Redis-клиента для получения дайджеста 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;
}
0 голосов
/ 08 мая 2019

Вы можете перенести вашу конфигурацию в папку вне пути к классам.

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

SpringApplication загружает свойства из файлов application.properties в следующих местах и ​​добавляет их в среду Spring:

  1. Подкаталог config текущего каталога
  2. Текущий каталог
  3. Пакет classpath / config
  4. Корень пути к классу

Список упорядочен по приоритету (свойства, определенные в расположениях выше в списке, переопределяют свойства, определенные в нижних местоположениях).

Если вам не нравится application.properties в качестве имени файла конфигурации, вы можете переключиться на другой файлимя, указав свойство среды spring.config.name.Вы также можете сослаться на явное местоположение, используя свойство среды spring.config.location (которое представляет собой разделенный запятыми список местоположений каталогов или путей к файлам).

Внешняя конфигурация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...