使用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