Apache Camel Spring DSL,指的是环境变量 HOSTNAME
Apache Camel Spring DSL, referring to an environment variable HOSTNAME
我正在使用带有 Spring DSL 的 Apache Camel 2.16.0
我有一个 Spring 上下文 XML,我在其中定义了一个 属性 PlaceHolder 来从各种文件中读取属性,如下所示 -
<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,例如 -
<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>
这很好用,我可以看到正在创建的 bean。
我在同一个应用程序中还有另一个 Spring 上下文 XML,它有一个骆驼上下文,我想使用在相同属性文件中定义的一些其他属性。我知道骆驼支持 Spring 属性 占位符,请参阅以下上下文摘录 -
<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)
请注意:我正在将我的应用程序作为 war 文件部署到 AWS 实例的 Tomcat 8 上。
我在 Windows 10 上有一个开发环境,我发现它在 Windows OS 上工作。我还看到 Apache Camel 2.16 中的文件 FilePathResolver.java 使用 System.getenv(key) 来获取值,即 System.getenv("HOSTNAME") 其中 returns 为 null在 AWS 实例上和 Windows 10 上的正确值。我也尝试使用 env:hostname(unix 的小写字母)但仍然没有运气......
我在 http://camel.apache.org/using-propertyplaceholder.html 找到了解决方案
在桥接 Spring 和骆驼 属性 占位符
它提到了以下 -
Spring 框架不允许第 3 方框架(如 Apache Camel)无缝挂接到 Spring 属性 占位符机制。但是,您可以通过声明类型为 org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer 的 Spring bean 轻松桥接 Spring 和 Camel,它是 Spring org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 类型。
我正在使用带有 Spring DSL 的 Apache Camel 2.16.0 我有一个 Spring 上下文 XML,我在其中定义了一个 属性 PlaceHolder 来从各种文件中读取属性,如下所示 -
<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,例如 -
<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>
这很好用,我可以看到正在创建的 bean。 我在同一个应用程序中还有另一个 Spring 上下文 XML,它有一个骆驼上下文,我想使用在相同属性文件中定义的一些其他属性。我知道骆驼支持 Spring 属性 占位符,请参阅以下上下文摘录 -
<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)
请注意:我正在将我的应用程序作为 war 文件部署到 AWS 实例的 Tomcat 8 上。 我在 Windows 10 上有一个开发环境,我发现它在 Windows OS 上工作。我还看到 Apache Camel 2.16 中的文件 FilePathResolver.java 使用 System.getenv(key) 来获取值,即 System.getenv("HOSTNAME") 其中 returns 为 null在 AWS 实例上和 Windows 10 上的正确值。我也尝试使用 env:hostname(unix 的小写字母)但仍然没有运气......
我在 http://camel.apache.org/using-propertyplaceholder.html 找到了解决方案 在桥接 Spring 和骆驼 属性 占位符
它提到了以下 -
Spring 框架不允许第 3 方框架(如 Apache Camel)无缝挂接到 Spring 属性 占位符机制。但是,您可以通过声明类型为 org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer 的 Spring bean 轻松桥接 Spring 和 Camel,它是 Spring org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 类型。