CamelContextの属性

<camelContext>の属性に値を設定することによって、Camelの動作を設定することができます。

起動処理

autoStartup

自動起動するかどうかを設定します。デフォルトはtrueです。falseにした場合は、何らかの方法で起動する必要があります。

<route startupOrder=“1”>のように、startupOrder属性を指定することで、ルートの起動順を指定することもできます。

delay

メッセージを次のコンポーネントを流通する際に、一定の時間(ms)waitします。デフォルトは0(ms)です。デバッグなどで、動作を確認したい場合などに使用します。<route>にも設定可能です。

終了処理

shutdownRunningTask

ルート終了時のコンシューマーの終了時の動作を設定します。CompleteCurrentTaskOnly(デフォルト)、CompleteAllTasksのいずれかを設定できます。

CompleteCurrentTaskOnlyは現在処理中のメッセージが完了後終了します。CompleteAllTasksは現在処理中のメッセージと、実行待ちしているメッセージが完了後終了します。

ファイルが100個あるディレクトリのポーリングを開始直後に終了処理が開始すると、CompleteCurrentTaskOnlyの場合は、今処理しているメッセージを処理を完了したら100個完了していなくても終了します。 一方、CompleteAllTasksの場合、ポーリング開始時の処理対象である100個のファイルは処理されます。ただし、ポーリングが開始した後にディレクトリに追加されたファイルは処理されません。

<camelContext>に設定すると、すべてのルートが対象になります。<route>に設定すると、そのルートが対象になります。

shutdownRunningTaskのイメージ

ログ

trace

ルートの実行状態をINFOレベルでログに出力します。デフォルトはfalseです。 trueに設定すると、メッセージが流通するごとに以下のようなログを出力します。

[main] ID-lily-61046-1391388071355-0-2 >>> (trace_route) from(direct://trace) --> log[(1) 実行前 headers = ${headers}] <<< Pattern:InOnly, Headers:{type=A, breadcrumbId=ID-lily-61046-1391388071355-0-1}, BodyType:String, Body:sample data
[main] (1) 実行前 headers = {type=A, breadcrumbId=ID-lily-61046-1391388071355-0-1}
[main] ID-lily-61046-1391388071355-0-2 >>> (trace_route) log[(1) 実行前 headers = ${headers}] --> choice <<< Pattern:InOnly, Headers:{type=A, breadcrumbId=ID-lily-61046-1391388071355-0-1}, BodyType:String, Body:sample data
[main] ID-lily-61046-1391388071355-0-2 >>> (trace_route) choice --> log[(2-a) Type A] <<< Pattern:InOnly, Headers:{type=A, breadcrumbId=ID-lily-61046-1391388071355-0-1}, BodyType:String, Body:sample data
[main] (2-a) Type A
[main] ID-lily-61046-1391388071355-0-2 >>> (trace_route) log[(2-a) Type A] --> mock://result <<< Pattern:InOnly, Headers:{type=A, breadcrumbId=ID-lily-61046-1391388071355-0-1}, BodyType:String, Body:sample data


例外が発生した場合は、Message HistoryやExchangeの内容が表示されます。

[main] Failed delivery for (MessageId: ID-emilia-42497-1391697727981-1-1 on ExchangeId: ID-emilia-42497-1391697727981-1-2). Exhausted after delivery attempt: 1 caught: java.lang.RuntimeException

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[trace_route_except] [trace_route_except] [direct://trace_exception                                                      ] [         3]
[trace_route_except] [throwException2   ] [throwException[java.lang.RuntimeException]                                    ] [         2]

Exchange
---------------------------------------------------------------------------------------------------------------------------------------
Exchange[
	Id                  ID-emilia-42497-1391697727981-1-2
	ExchangePattern     InOnly
	Headers             {breadcrumbId=ID-emilia-42497-1391697727981-1-1, CamelRedelivered=false, CamelRedeliveryCounter=0, type=A}
	BodyType            String
	Body                sample data
]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
java.lang.RuntimeException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

ログを変更したい場合は、

<bean id="camelTracer" class="org.apache.camel.processor.interceptor.Tracer">
    <property name="traceExceptions" value="false"/>
    <property name="traceInterceptors" value="true"/>
    <property name="logLevel" value="ERROR"/>
    <property name="logName" value="com.mycompany.messages"/>
</bean>

のように、org.apache.camel.processor.interceptor.Tracerを定義し、プロパティに値を設定します。 設定可能なプロパティは、Tracer Interceptorを参照してください。

また、出力形式も下記のように設定可能です。設定可能なプロパティは、Tracer Interceptorを参照してください。

    <!-- traceの出力形式を設定 -->
    <bean id="traceFormatter" class="org.apache.camel.processor.interceptor.DefaultTraceFormatter">
        <!-- BODYの形式、内容を非表示 -->
        <property name="showBody" value="false"/>
        <property name="showBodyType" value="false"/>
        <!-- パンくずリストを非表示 -->
        <property name="showBreadCrumb" value="false"/>
        <!-- 出力文字数を制限 -->
        <property name="maxChars" value="100"/>
    </bean>

上記の設定をした場合、ログは以下のようになります。BODYに関して非表示に、ログが100文字以上出力されていないことがわかります。

[main] >>> (trace_route) from(direct://trace) --> log[(1) 実行前 headers = ${headers}] <<< Pattern:InOnly, Hea...
[main] (1) 実行前 headers = {type=A, breadcrumbId=ID-lily-61939-1391399111922-0-1}
[main] >>> (trace_route) log[(1) 実行前 headers = ${headers}] --> choice <<< Pattern:InOnly, Headers:{type=A, ...
[main] >>> (trace_route) choice --> log[(2-a) Type A] <<< Pattern:InOnly, Headers:{type=A, breadcrumbId=ID-...
[main] (2-a) Type A
[main] >>> (trace_route) log[(2-a) Type A] --> mock://result <<< Pattern:InOnly, Headers:{type=A, breadcrum...

messageHistory

tracetrueの場合に表示されるMessage Historyを非表示にする場合に、falseに設定します。デフォルトはtrueです。

MessageHistoryオブジェクトが大量に生成されるため、不要であればfalseにしたほうがいいかもしれません。

useMDCLogging

log4jやlogbackが提供するMDC(Mapped Diagnostic Context)を使用します。簡単に言うと、Camelの情報をログに出力することができるようになります。デフォルトはfalseです。

ログにルートのIDを出力したい場合は、log4j.xmlの出力形式に以下のように%X{camel.routeId}を追加します。

        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%t] - %10X{camel.routeId}  - %m%n" />
        </layout>

ログには、次のようにルートIDmdc_routeが出力されます。

[main] -  mdc_route  - (1) 実行前 headers = {breadcrumbId=ID-emilia-48011-1391428941566-0-1, type=A}
[main] -  mdc_route  - (2-a) Type A

ルートID以外にもいくつか出せます。Apache Camel: MDC logging - MDC informationを参照してください。

useBreadcrumb

上記のMDCで、camel.breadcrumbIdを使用できるようにする場合trueを設定します。デフォルトはtrueなので、あまり使う機会はないでしょう。

その他

streamCache

ファイルの読み込みなどでストリーム処理を行いますが、ある程度(128kb)大きい場合、メモリではなくテンポラリのファイルにキャッシュします。デフォルトはfalseです。

threadNamePattern

Camelで生成するスレッド名のパターンを定義します。デフォルトは、Camel (#camelId#) thread ##counter# - #name#です。

Camelで生成したスレッド名には、デフォルトでは[Camel (camel-1) thread #1 - Split] のように設定されます。

[Camel (camel-1) thread #1 - Split] (2) 実行中 BODY = No.0
[Camel (camel-1) thread #2 - Split] (2) 実行中 BODY = No.1
[Camel (camel-1) thread #3 - Split] (2) 実行中 BODY = No.2

このスレッド名を変更したい場合に、この値を設定します。使用できる変数は以下の通りです。

変数 説明
camelId CamelContextの名前
counter カウンター。同一のスレッドを識別するために使用します。
name 元のスレッド名。<threadPool />threadName属性で設定したスレッド名など。Splitterが生成したスレッドであればSplit
longName 元のスレッド名に、エンドポイントのパラメータなどの情報がついたもの。

ThreadNamePatternに、#変数名#形式で使用します。

    <camelContext threadNamePattern="#camelId# thread##counter# #longName#" 
                  xmlns="http://camel.apache.org/schema/spring">
        <route>

変更する機会はそれほどないと思いますが、複数のCamelアプリケーションを動かす場合で、スレッドを区別したい場合に役に立つかもしれません。