#mule #mule-component
#mule #mule-компонент
Вопрос:
у нас есть поток, в котором у нас есть ссылка на файл свойств, как указано ниже
"context:property-placeholder location="httpdemo.${country}.properties"
теперь мы хотим ${country}
, чтобы значение было заменено фактическим значением во время развертывания.
Как мы знаем, один из способов добиться этого — установить значение country в качестве переменной среды в ESB и развернуть его. Но мы не хотим этого делать по следующим причинам:
-
Мы параллельно развертываем одну и ту же кодовую базу для нескольких стран
-
Свойства среды могут быть установлены только во время запуска среды выполнения mule, поэтому, если я установил переменную env как
country=UK
и развернул для Великобритании. Позже я снова захочу развернуть для СВОЕГО, мне нужно перезапустить ESB, установивcountry=MY
, что мы не хотим делать.
Пожалуйста, дайте мне знать, если есть какой-либо другой лучший способ
Комментарии:
1. Приведенный вами пример содержит либо слишком много кавычек, либо слишком мало кавычек, если вы добавили их для StackOverflow. Пожалуйста, отредактируйте и исправьте это с помощью форматирования кода.
Ответ №1:
У нас была похожая ситуация, когда нам нужно было иметь несколько версий одного и того же приложения, работающих параллельно. Решение, которое мы использовали для этого, заключалось в том, чтобы упаковать файл свойств вместе со сборкой и не добавлять к нему динамический элемент (основанный на среде). Например; в этом случае мы создаем httpdemo.usa.properties и упаковываем его вместе с приложением. Это было довольно легко для нас, поскольку мы используем Jenkins для управления нашими сборками и выпусками. Когда сборка выпущена, мы ссылаемся на файл конфигурации от Jenkins, который содержит все конкретные свойства, связанные со «страной». Вы даже можете передать эту страну в качестве параметра в определение сборки. Используя пользовательский плагин maven, мы заменяем файл свойств в приложении новыми свойствами из файла свойств Дженкинса.
Другим решением вашей проблемы может быть соблюдение соглашения об именовании для ваших приложений, специфичных для «страны», которую вы хотите использовать, и получение свойств с помощью spring beans. Например;
<spring:beans>
<spring:bean id="CountryProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<spring:property name="singleton" value="true"/>
<spring:property name="location" value="${app.name}.properties"/>
</spring:bean>
</spring:beans>
<http:listener-config name="HTTP_Listener_Configuration" host="localhost" port="5000" doc:name="HTTP Listener Configuration"/>
<flow name="dynamic_propsFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
<logger message="#[app.registry.CountryProperties['country.full.name']]" level="INFO" doc:name="Logger"/>
</flow>
Мои свойства такие, как показано ниже:
File - dynamic_props_usa.properties
population=10
country.full.name=united.states.of.america
File - dynamic_props_mexico.properties
population=100
country.full.name=mexico
${app.name } дает вам имя развернутого приложения. В случае, если мое приложение называется dynamic_props_usa, оно ссылается на dynamic_props_usa.properties . Если это dynamic_props_mexico, он ссылается на dynamic_props_mexico.properties . Надеюсь, это поможет!
Ответ №2:
Определите заполнитель свойства контекста, чтобы иметь ссылку на файл в пакете и иметь возможность переопределять его с помощью сервера, если это необходимо во время выполнения, как показано ниже,
<context:property-placeholder location="classpath:app-${mule.env}.properties, file:${mule.config.path}/app-${mule.env}.properties" ignore-resource-not-found="true" ignore-unresolvable="true" />
Ответ №3:
Вы можете запустить локальный сервер Mule с опцией -M-Dmule.country=your-value
Возможно, вы захотите ознакомиться с документацией