プロパティファイルによる値の設定

Camelでは、プロパティをコンポーネントに設定しますが、IPアドレス、ユーザ名、パスワードなどは、試験環境や運用環境によって異なります。その場合は、プロパティの値をプロパティファイルに外部化することで対応することができます。

プロパティの外部化には、Camel独自の外部化とSpringによる外部化の2通りあります。

Camel独自の外部化

Camelでは、<propertyPlaceholder>を使ってプロパティファイルを設定します。

 
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <!-- プロパティファイルの設定 -->
        <propertyPlaceholder 
            id="properties" 
            location="classpath:com/buildria/camel/example/basis/property/example.properties"/>
    :

location属性にプロパティファイルのパスを設定します。 上記の場合は、classpath:を使用し、クラスパスでプロパティファイルexample.propertiesを指定しています。クラスパスではなくパスで指定する場合は、file:をパスの先頭に追加します。

プロパティファイルexample.propertiesには、設定する値をキー=値の形式で設定します。

# 出力先フォルダ
folder=basis/property/camel/component

上記で設定した値を、{{プロパティのキー}}の形式でプロパティに設定します。

        <route>
            <from uri="direct:classpath"/>
            <!-- Simple言語では、${properties:xxx}で参照 -->
            <log message="(1) folder = ${properties:folder}" />
            <!-- {{xxx}}でプロパティの値を参照 -->
            <to uri="file:target/{{folder}}"/>
        </route>

プロパティファイルの切替え

上記の方法で、プロパティを外部化することができますが、試験環境、運用環境でプロパティファイルの値を変更したい場合があります。 その場合は、プロパティファイルを配置するディレクトリを、環境ごとにシステムプロパティか環境変数で定義し、プロパティファイルのパスをその値を使用して設定します。

システムプロパティEXAMPLE_HOMEにあるexample.propertiesを設定する場合を以下に示します。

    <camelContext xmlns="http://camel.apache.org/schema/spring">
         <!-- プロパティファイルの設定 システムプロパティ"EXAMPLE_HOME"を設定しておく-->
        <propertyPlaceholder id="properties" 
                             location="file:${EXAMPLE_HOME}/example.properties"/>
        :                     

上記のように設定し、アプリケーション起動時のオプションで、-DEXAMPLE_HOME=/etc/defaultのように環境に応じたexample.propertiesファイルのディレクトリを切り替えます。

環境変数を使用する場合は、${env:EXAMPLE_HOME}のようにenv:を追加します。

    <camelContext xmlns="http://camel.apache.org/schema/spring">
         <!-- プロパティファイルの設定 環境変数"EXAMPLE_HOME"を設定しておく-->
        <propertyPlaceholder id="properties" 
                             location="file:${env:EXAMPLE_HOME}/example.properties"/>
        :                     

Springによる外部化

Camel独自のプロパティファイルの外部化で定義したプロパティは、<camelContext>の中でしか使用できません。 Springの設定でもプロパティを使用する場合は、org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurerを使用して、プロパティファイルを外部化します。

    <!-- プロパティファイルの設定 -->
    <bean id="bridgePropertyPlaceholder"
          class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer">
        <property name="location"
              value="classpath:com/buildria/camel/example/basis/property/example.properties"/>
    </bean>
    
    <camelContext xmlns="http://camel.apache.org/schema/spring">
       :

プロパティファイルの設定は上記で、システムプロパティ、環境変数による切り替えも可能です。

上記の設定を使用した場合は、Springの標準である<context:property-placeholder>は使用できません。

プロパティを使用する場合、下記のように使用する箇所によって記述形式が違います。

使用箇所 記述形式
<camelContext><endpoint> {{xxx}}, ${xxx}
<camelContext><route> {{xxx}}
上記以外 ${xxx}

    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <!-- endpointでは、${xxx}形式も使用可 -->
        <endpoint id="out" uri="file:target/${folder}" /> 
                
        <route>
            <from uri="direct:classpath"/>
            <!-- Simple言語では、${properties:xxx}で参照 -->
            <log message="(1) folder = ${properties:folder}" />
            <!-- {{xxx}}でプロパティの値を参照 -->
            <to uri="file:target/{{folder}}"/>
            <to ref="out" />
        </route>
    </camelContext>

Splitter

注意事項

いずれの場合でも、すべてのプロパティを外部化できるわけではありません。 例えば、

        <split parallelProcessing="{{parallelProcessing}}">
            <simple>${body}</simple>
            <log message="(2) ${body}." />
        </split>  

のように、parallelProcesing属性を外部化すると、

Caused by: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 64; 
  cvc-datatype-valid.1.2.1: '{{palallelProcessing}}'は'boolean'の有効な値ではありません。

といった例外が発生します。これは、XMLのスキーマでparallelProcessing属性が真偽値と定義されているため、Spring XML読み込み時の検証で弾かれるためです。文字列と定義されていれば問題ありません。

通常のコンシューマーやプロデューサーのプロパティは、文字列であるuri属性にクエリーパラメータ形式で記述すので問題ありません。 しかし、SplitterAggregatorのような独自のタグを使用する場合は、文字列を設定できるプロパティしか外部化できません。

参考情報