Как обрабатывать несколько резервных значений в Spring Expression Language - PullRequest
1 голос
/ 06 мая 2020

Вопрос: как я могу обработать цепочку резервных значений в выражении Spring, позволяя мне откатиться к конфигурации более высокого уровня, пока я не получу определенное значение?

Чтобы немного объяснить, давайте проиллюстрируем это моим собственный вариант использования: я намеревался создать приложение Spring, используя аннотацию @Scheduled для запуска некоторых процессов. Дело в том, что у меня много запланированных задач, и я бы позволил легко настраивать рабочую частоту для всех из них или только для подмножества.

Итак, я искал что-то вроде

@Component
public class SpecificTaskRunner {

   @Scheduled(cron = "${ specific-task-cron ?: task-families-cron ?: default-cron }")
   public void specificTask() {
      doSomething();
   }

}

Разрешить приложению настраивать частоту всех запланированных задач сразу, переопределив значение default-cron, или только их подмножество, переопределив свойство семейства задач, или, наконец, указав для каждой задачи. Преимущество этого подхода состоит в том, что он позволяет играть с несколькими уровнями конфигурации, поскольку каждая запланированная задача ищет соответствующее свойство, начиная с самого определенного c, и ищет более универсальное c, пока не получит что-то определенное, в конечном итоге поддержка глобального значения по умолчанию.

К сожалению ... это не работает. При оценке, если первый элемент не определен, тогда откат для всего оставшегося. В этом примере это будет означать, что если в конфигурации отсутствует значение для specific-task-cron, то разрешенное значение будет: task-families-cron ?: default-cron, что, к сожалению, не то, что я ищу!

1 Ответ

0 голосов
/ 06 мая 2020

Я нашел 2 способа справиться с этим:

Первый основан исключительно на выражении Spring. Spring, кажется, переоценивает результат оператора Элвиса, если он также является выражением Spring. Итак, моя рабочая конфигурация была:

@Component
public class SpecificTaskRunner {

   @Scheduled(cron = "${ specific-task-cron ?: ${ task-families-cron ?: default-cron }}")
   public void specificTask() {
      doSomething();
   }

}

Что в моем реальном варианте использования, с еще одним откатом, было не очень удобно ...

Поэтому я переключился на более простое решение, основанное на конфигурации путем определения цепочки значений следующим образом:

#application.yml

default-cron: '0 */5 0 0 0 0' #every 5 minutes
task-families-cron: ${default-cron}
specific-task-cron: ${task-families-cron}

В сочетании с

@Component
public class SpecificTaskRunner {

   @Scheduled(cron = "${specific-task-cron}")
   public void specificTask() {
      doSomething();
   }

}

Таким образом, любое переопределение свойства применяется к иерархическим подуровням, если только они не были переопределены.

Кажется, оба решения работают, так что, в конце концов, да, язык выражений Spring обрабатывает множественные откаты. Следует ли его использовать, или подход к настройке лучше читается ... Я предоставляю вам решать.

...