使用Apache Camel处理外部属性文件
首先
本文介绍了如何从外部文件中使用各种属性来在Apache Camel中使用。
Apache Camel中的File、FTP等各种组件都有许多选项。为了根据生产环境或开发环境等环境的不同来更改选项值,通常会使用外部属性文件。
使用外部属性文件
让我们使用外部属性文件来创建一个简单的示例。
首先,生成PropertiesComponent类的实例,并使用setLocation方法指定属性文件的位置。
static PropertiesComponent createPropertiesComponent() {
PropertiesComponent component = new PropertiesComponent();
component.setLocation("classpath:myapp.properties");
return component;
}
在下面的代码中,我们指定了类路径中的myapp.properties文件。
组件.setLocation(“classpath:myapp.properties”);
如果是文件路径的话,请按照以下方式指定。
组件.setLocation(“file:myapp.properties”);
使用myapp.properties文件,main方法的代码如下所示。
public static void main(String[] args) {
try {
CamelContext context = new DefaultCamelContext();
context.addComponent("properties", createPropertiesComponent());
context.addRoutes(createRouteBuilder());
context.start();
Thread.sleep(5000);
context.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
在下面的一行代码中,我们将通过createPropertiesComponent方法生成的PropertiesComponent实例添加到CamelContext中。
这将使得我们能够在CamelContext内部处理属性。
context.addComponent("properties", createPropertiesComponent());
以下是实际属性的使用示例。
使用Camel属性的值可以通过在PropertyPlaceholder中指定键名为{{key}}的形式来获取。
在创建Java DSL的根时,可以指定属性键为”{{input_dir}}”、”{{output_dir}}”。
static RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() throws Exception {
from("file:{{input_dir}}?noop=true").to("file:{{output_dir}}");
}
};
}
实际的属性文件定义如下。
input_dir=data/input
output_dir=data/output
在Camel中,您可以使用Spring来使用外部属性文件,但是您也可以使用Property组件来使用,即使没有Spring也可以。
如果是XML DSL的情况下
如果使用Spring XML DSL,则可以这样定义ID为properties的Spring bean。
<bean id="properties"
class="org.apache.camel.component.properties.PropertiesComponent">
<property name="location"
value="classpath:myapp.properties" />
</bean>
在这个例子中,配置了读取属性文件”classpath:myapp.properties”的设置。
下面是使用这个属性的路由示例。
在被”{{}}”包围的地方读取各个属性。
<camelContext
xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:{{input_dir}}?noop=true" />
<to uri="file:{{output_dir}}" />
</route>
</camelContext>
在处理器中使用属性
使用resolvePropertyPlaceholders方法或PropertyInject注解在处理器内使用属性。
public class TestProcessor implements Processor {
private Logger logger = LoggerFactory.getLogger(TestProcessor.class);
@PropertyInject("greeting")
private String greeting;
@Override
public void process(Exchange exchange) throws Exception {
String testStr = exchange.getContext().resolvePropertyPlaceholders("{{test_str}}");
logger.info("TestProcessor testStr = {}", testStr);
logger.info("TestProcessor greeting = {}", greeting);
}
}
使用resolvePropertyPlaceholders方法获取配置文件的test_str属性的值。
同时,使用PropertyInject注解将配置文件的greeting属性的值注入到greeting变量中。
使用BridgePropertyPlaceholderConfigurer。
如果想要在CamelContext内处理属性,可以使用PropertiesComponent方法。如果想要在Spring内处理属性,可以使用BridgePropertyPlaceholderConfigurer方法。
<bean id="bridgePropertyPlaceholder" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer">
<property name="location" value="classpath:myapp.properties"/>
</bean>
另外,BridgePropertyPlaceholderConfigurer不能与Spring的property-placeholder一起使用。
使用JVM参数
虽然不是外部属性文件,但也可以使用JVM参数的值。
在这种情况下,不需要使用PropertyPlaceholder,而是需要设置JVM参数如下。
-Dinput_dir=data/input -Doutput_dir=data/output
要在程序中使用属性,可以使用{{sys:属性名称}}指定。
以下是使用JVM参数的示例。
from("file:{{sys:input_dir}}?noop=true").to("file:{{sys:output_dir}}");
由于直接在JVM参数中指定每个属性是非常困难的,所以不建议使用这种方法。相反,建议根据环境的不同使用不同的属性文件来切换。
component.setLocation("file:${propertiesFile}/myapp.properties");
由于{{sys:propertiesFile}}无法正常工作,所以改为${propertiesFile}。为什么无法正常工作原因不明。
-DpropertiesFile=production
在这段代码中,我们可以通过将${propertiesFile}作为JVM参数并根据不同的环境来改变JVM参数的方式,实现在本地开发环境、staging环境和production环境之间切换配置文件的功能。
使用环境变量
在Camel中,您可以使用${env:環境変数名}来获取环境变量的值。
component.setLocation("file:${env:propertiesFile}/myapp.properties");
请参考
- Using PropertyPlaceholder