Apache Camel Advent Calendar 16日目の記事は、サポート担当古市が担当します。 テーマは、「Camel で header/variable を使い分ける」

Camel 2.x ユーザーの皆さんにはお馴染みの message header。consumer endpointから受け取った exchange に対して、とりあえず setHeader() を実行されている方も多いのではないでしょうか。 ルーティングに直結するようなメタデータを格納するのに便利な header ですが、ルーティング中の処理で必要となるがメッセージ自体とは直接関係しないアプリケーションデータなどは、message header ではなく exhcange property に格納する使い分けをお勧めしています。
余談ですが、Camel 4.x で Exchange property に Simple言語でアクセスする場合、以下のようになります。
${exchangeProperty.foo} //プロパティー名 foo にアクセス
exchange property の課題としては、Camel 自体も内部のコントロールに使用していることが多々あり、純粋にユーザーアプリケーションデータのみを取り扱うことができませんでした。 (例: split では、CamelSplitIndex, CamelSplitComplete, CamelSplitSize が使われます。)
Camel 4.x で登場した variable を使うことで、この課題を克服できます。それだけでなく、variable はスコープの管理も可能であり、より柔軟なアクセス管理を実現できます。
- ExchangeVariableRepository - exchange 毎に管理される。 Camel DSL 内では、デフォルトでこちらが使われる。
exchange.getVariable("myKey") - RouteVariableRepository - ルート毎に管理される。 Camel DSL 内では、プリフィックス "route:" でアクセスする。
exchange.getVariable("route:myRouteId:myRouteKey"),context.getVariable("route:myRouteId:myRouteKey") - GlobalVariableRepository - CamelContext 毎に管理される。 Camel DSL 内では、プリフィックス "global:" でアクセスする。
exchange.getVariable("global:myGlobalKey"),context.getVariable("myGlobalKey")
Exchange property と同様、コーディングは直感的でわかり易いかと思います。 variable は Parameter Binding にも対応していますので、Bean method からのアクセスも簡単に実装可能です。
今後はぜひ message header と variable を使い分け、よりメンテナンスのし易い設計をご検討いただければと思います。 明日の advent calendar 17日目では、「Camel アンチパターン」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com