Оценка свойств внутри Spring Expression Lang (SpEL)

В нашем сервисе есть процесс, запланированный в соответствии с файлом свойств, который считывает свойство refreshIntervalMillis. Его значение вводится непосредственно в триггер Quartz с такой конфигурацией:

<bean name="trigger"
    class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean "
    p:repeatInterval="${refreshIntervalMillis}"> 
...
</bean>

Однако администраторы, устанавливающие эту службу, думают о часах/днях, поэтому, чтобы упростить им задачу, мы изменили это на:

  1. refreshIntervalMillis переименован в refreshIntervalMinutes.
  2. Изменен код выше на следующее:
p:repeatInterval="#{ 1000 * 60 * T(java.lang.Integer).valueOf(@configurationProperties['garbageLevelWatcher.refreshIntervalMinutes'])}"

Примечание: объект свойств представлен как bean-компонент с именем «configurationProperties».

Есть ли более простой синтаксис для выполнения того же?

Спасибо,


person Sebastian    schedule 19.03.2013    source источник


Ответы (2)


"#{T(java.util.concurrent.TimeUnit).MINUTES.toMillis( @configurationProperties['garbageLevelWatcher.refreshIntervalMinutes'])}"

РЕДАКТИРОВАТЬ:

Or...

<context:property-placeholder properties-ref="configurationProperties"
<util:constant id = "MINUTES" static-field="java.util.concurrent.TimeUnit.MINUTES" />

а также

"#{@MINUTES.toMillis(${garbageLevelWatcher.refreshIntervalMinutes})}"
person Gary Russell    schedule 19.03.2013
comment
Почему java.util.concurrent.TimeUnit? загрузка Spring ApplicationContext выполняется один раз и в один поток - person emd; 20.03.2013
comment
Просто у него есть удобные методы преобразования - нет необходимости в 1000 * 60 - ОП попросил более простой синтаксис. TimeUnit — это перечисление с целой кучей методов преобразования. Когда выражение оценивается, это совершенно не имеет отношения к этому обсуждению. - person Gary Russell; 20.03.2013
comment
Гэри, хороший совет, я забыл о методах TimeUnit. Я проголосовал за ваш ответ. Я оставлю вопрос открытым на несколько дней, ожидая новых идей, чтобы сделать его еще проще, т.е. можем ли мы поместить MINUTES и свойства в контекст, чтобы мы могли просто написать #{MINUTES.toMillis(${garbageLevelWatcher.refreshIntervalMinutes})} (в идеале...) - person Sebastian; 26.03.2013
comment
Я отредактировал свой ответ альтернативой; если у вас есть общий файл ‹import/›, вы можете поместить в него константу. - person Gary Russell; 26.03.2013
comment
Просто обратите внимание, что @MINUTES можно записать как просто MINUTES, по крайней мере, у меня это работало в конфигурации XML. - person Brad Cupit; 24.04.2013

Если свойства просматриваются с помощью PropertyPlaceholderConfigurer, @PropertySource или ‹context:property-placeholder /› и контекст знает об этом

Вы можете написать это так:

p:repeatInterval="#{ 1000 * 60 * T(java.lang.Integer).valueOf('${garbageLevelWatcher.refreshIntervalMinutes}') }"
person emd    schedule 19.03.2013
comment
Да, свойства также ищутся по контексту: свойство-заполнитель. Как мы можем сделать контекст SpEL осведомленным о них? - person Sebastian; 26.03.2013
comment
Насколько я знаю, он автоматически знает об этом - person emd; 26.03.2013
comment
контекстное свойство-заполнитель просто необходимо определить в application-context.xml, в отличие от webmvc-context.xml, который устанавливает веб-контекст. - person chrismarx; 24.06.2015