Camel で header/variable を使い分ける

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

Camel 2.x ユーザーの皆さんにはお馴染みの message header。consumer endpointから受け取った exchange に対して、とりあえず setHeader() を実行されている方も多いのではないでしょうか。 ルーティングに直結するようなメタデータを格納するのに便利な header ですが、ルーティング中の処理で必要となるがメッセージ自体とは直接関係しないアプリケーションデータなどは、message header ではなく exhcange property に格納する使い分けをお勧めしています。

camel.apache.org

余談ですが、Camel 4.x で Exchange property に Simple言語でアクセスする場合、以下のようになります。

${exchangeProperty.foo} //プロパティー名 foo にアクセス

camel.apache.org

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")

camel.apache.org

Exchange property と同様、コーディングは直感的でわかり易いかと思います。 variable は Parameter Binding にも対応していますので、Bean method からのアクセスも簡単に実装可能です。

camel.apache.org

今後はぜひ message header と variable を使い分け、よりメンテナンスのし易い設計をご検討いただければと思います。 明日の advent calendar 17日目では、「Camel アンチパターン」 についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。