2016-10-10 2 views
0

Я использую Apache Camel 2.16.0 с Spring DSL У меня есть контекстный XML-код Spring, в котором я определил свойство PlaceHolder для чтения свойств из разных файлов, как показано ниже:Apache Camel Spring DSL, ссылаясь на переменную окружения HOSTNAME

<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="ignoreResourceNotFound" value="false"/> 
    <property name="locations"> 
     <list> 
      <value>classpath:/properties/versioning.properties</value> 
      <value>classpath:/properties/#{inetAddress.hostName}.properties</value> 
     </list> 
    </property> 
</bean> 
<bean id="inetAddress" class="java.net.InetAddress" factory-method="getLocalHost"/> 

значения свойств используются для построения других бобов, таких как -

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/> 
    <property name="url" value="${${LIVE_}DATASOURCE_URL}"/> 
    <property name="username" value="${${LIVE_}DATASOURCE_USERNAME}"/> 
    <property name="password" value="${${LIVE_}DATASOURCE_PASSWORD}"/> 
</bean> 

Это прекрасно работает, я могу видеть, бобы создается. У меня также есть другой Spring Context XML в том же приложении, в котором есть контекст верблюда, и я хочу использовать некоторые другие свойства, определенные в тех же файлах свойств. Я знаю, что верблюд поддерживает Spring Property Заполнитель см ниже выдержки из контекста -

<camelContext id="charge-process-context" xmlns="http://camel.apache.org/schema/spring"> 
    <propertyPlaceholder id="properties" 
     location="classpath:/properties/versioning.properties, 
          properties/${env:HOSTNAME}.properties" 
     xmlns="http://camel.apache.org/schema/spring" /> 
    ..... 
    ..... 
</camelContext> 

В рамках этого контекста, у меня есть маршрут, который использует протокол HTTPS компонент, который использует значения из файла свойств, таких, как показано ниже -

<to uri="https4:{{LIVE_AUTH_RESPONSE_HOST}}:{{LIVE_AUTH_RESPONSE_PORT}}/{{LIVE_AUTH_RESPONSE_CONTEXT_PATH}}"/> 

Этот маршрут не запускается и бросает следующее исключение -

Caused by: java.lang.IllegalArgumentException: Cannot find system environment with key: HOSTNAME 
    at org.apache.camel.util.FilePathResolver.resolvePath(FilePathResolver.java:54) 
    at org.apache.camel.component.properties.PropertiesComponent.parseLocations(PropertiesComponent.java:434) 
    at org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:163) 
    at org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:148) 
    at org.apache.camel.impl.DefaultCamelContext.resolvePropertyPlaceholders(DefaultCamelContext.java:2261) 
    at org.apache.camel.model.ProcessorDefinitionHelper.resolvePropertyPlaceholders(ProcessorDefinitionHelper.java:730) 
    at org.apache.camel.model.ProcessorDefinition.createOutputsProcessorImpl(ProcessorDefinition.java:427) 
    at org.apache.camel.model.ProcessorDefinition.createOutputsProcessor(ProcessorDefinition.java:413) 
    at org.apache.camel.model.ProcessorDefinition.createOutputsProcessor(ProcessorDefinition.java:165) 
    at org.apache.camel.model.ExpressionNode.createFilterProcessor(ExpressionNode.java:109) 
    at org.apache.camel.model.WhenDefinition.createProcessor(WhenDefinition.java:74) 
    at org.apache.camel.model.WhenDefinition.createProcessor(WhenDefinition.java:32) 
    at org.apache.camel.model.ProcessorDefinition.createProcessor(ProcessorDefinition.java:483) 
    at org.apache.camel.model.ChoiceDefinition.createProcessor(ChoiceDefinition.java:135) 
    at org.apache.camel.model.ProcessorDefinition.makeProcessorImpl(ProcessorDefinition.java:534) 
    at org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:495) 
    at org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:219) 
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1069) 

Пожалуйста Примечание: Я развертывание мое приложение в качестве военного файла на сервере Tomcat 8 на AWS пример. У меня есть среда Dev в Windows 10, и я нашел это работающим в ОС Windows. Я также видел, что файл FilePathResolver.java в Apache Camel 2.16 использует System.getenv (key) для получения значения ie System.getenv («HOSTNAME»), которое возвращает нуль на экземпляр AWS и правильное значение в Windows 10. I также попытался с помощью ENV: имя хоста (строчные буквы для UNIX), но до сих пор не повезло ...

ответ

0

Я нашел решение в http://camel.apache.org/using-propertyplaceholder.html в Bridging весной и Camel собственности

Указатель места заполнения

Он упоминает следующее -

Spring Framework не позволяет сторонним фреймворкам, таким как Apache Camel, подключаться к механизму замещения свойств Spring. Однако вы можете легко переместить Spring и Camel, объявив Spring bean с типом org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer, который представляет собой Spring org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.

Смежные вопросы