Apache Camel 2.19.0 の新機能

Apache Camel 2.19.0 がリリースされたので、注目機能をまとめてみる。
http://camel.apache.org/camel-2190-release.html

# Apache Camel とは

[Apache Camel](https://github.com/apache/camel/) は 軽量かつ高機能なインテグレーションフレームワーク。Java で作られているが、Scala、Kotlin、Clojure など他の JVM 言語上でも使えるはずである。

- デフォルトで 200 以上用意されているコンポーネントを使って、様々な外部サービスやインタフェースに接続できる。
- Java / XML DSL で [Enterprise Integration Patterns (EIP)](http://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html) が完全に実装されていて、外部からの入出力メッセージをきれいにルーティングできる。
- 単一の JAR ライブラリとしてプログラムに組み込む用途から、[JBoss Fuse](https://developers.redhat.com/products/fuse/overview/) のようなフルスタックの ESB サーバのコアルーティングエンジンとしての用途まで、幅広く使える。
- Spring Boot をサポートしていて、クラウド上でのマイクロサービスな使い方もできる。

# 2.19.0 の注目機能

一番の目玉は、[Camel Connector](https://github.com/apache/camel/blob/master/connectors/camel-connector/src/main/docs/connector-component.adoc#connector-component) の導入。その他、追加された機能は数が多いので、細かいものは省略して注目すべきもののみ以下にリストアップした。（全部を確認したい方は、[こちら](http://camel.apache.org/camel-2190-release.html)を参照。）

- Camel Connector が新たに導入された。Connector は Component よりもユースケースを絞って、すぐに外部システムと連携できるようにしたもの。本格的なインテグレーションエンジニアでないシチズンインテグレータ（a.k.a. iPaaS ユーザ）が、簡単にシステム間連携を組めることを目指したもの。
- Spring Boot
    - Spring Boot 1.5.x にアップグレード。
    - すべての Camel Spring Boot starter コンポーネントがメタデータのデフォルト値を持つようにし、各種開発ツールから確認できるようにした。
    - Camel Spring Boot starter コンポーネントは自動設定を `org.apache.camel.springboot.CamelAutoConfiguration` に依存するようにした。こうすることで、単体テストで `org.apache.camel.springboot.CamelAutoConfiguration` を除くことで Camel Spring Boot の自動設定を無効にできるようになった。
- ツール系
    - Camel Maven Plugin に `camel:validate` ゴールを追加。コンパイル時に Java / XML ルート DSL のバリデーションができる。
    - Camel Main、Spring Boot、および Camel Maven Plugin が自動で JVM を停止するようになった。停止条件は、一定時間の経過、全メッセージ処理終了、および一定のアイドル時間、を設定できる。
    - Camel Maven Plugin が XML DSLからのライブリロードをできるようになった。Main クラスからも、ライブリロードの設定が可能。
    - OWASP dependency check Maven プラグインのサポート。
- Camel 3.0 で廃止予定のコンポーネントと camel-core API をさらに非推奨にした。
- Camel のソースコードを Java 9 でもビルドできるようにした。
- `ReloadStrategy` SPI を導入した。これにより、カスタムプロバイダがルートのライブリロードを開始できるようになる。
- Camel Catalog による、特定のコンポーネント、言語、データ形式しかサポートしないカスタムランタイムプロバイダのサポート。サンプルは `camel-catalog-provider-karaf` (Karaf) と `camel-catalog-provider-springboot` (Spring Boot) を参照。
- Failover Load Balancer に `inheritErrorHandler=false` を設定した場合、ロードバランサが枯渇したあとに Camel の Error Handler が実行されるようになった。
- Camel ルートの XML ダンプが `xpath` 表記のカスタム名前空間を含むようにした。同様に、XML Camel ルートを編集すると `xpath` 表記の名前空間が追加される。
- `RouteIdFactory` の追加。`RouteIdFactory` を使えば、ルート ID を `route1`、`route2` よりも意味のある名前に自動設定できる。
- Simple 言語に `skip` 関数を追加。
- Jetty 9.3 へアップグレード。（Karaf 4.0.x ユーザ向けに Jetty 9.2 は引き続きサポート。）
- サンプルのまとめをソースコードから生成するようにしたので、常に最新の状態を確認できるようになった。https://github.com/apache/camel/tree/master/examples#examples
- データ型に基づく宣言的な Transformer と Validator を導入。使い方のサンプルは `camel-example-transformer-blueprint`、`camel-example-transformer-cdi`、`camel-example-transformer-demo`、`camel-example-validator-spring-boot` を参照。

## コンポーネント別の新機能

- Bean コンポーネント
    - `Callable` インスタンスを返すメソッドを呼び出した場合、その `Callable` のメソッドも呼び出すようにした。それによって、Groovy の関数／クロージャなどが呼び出せるようになった。
- Salesforce コンポーネント
    - `limits`, `recent items`, `approvals` and `composite` API のサポート。
- NATS コンポーネント
    - TLS とコネクション自動フラッシュのサポート。
- Metrics コンポーネント
    - `Gauge` タイプサポート。
- File コンポーネント
    - `idempotent-changed` または `idempotent-rename` によるクラスタリングの読込ロック・ストラテジのサポート。
- CDI コンポーネント
    - RouteBuilder auto-configuration can now be disabled from Camel CDI configuration
    - Camel contexts automatic start can now be disabled from Camel CDI configuration
    - Camel CDI now provides support for TransactionErrorHandler and TransactionPolicy via JTA
- Kafka コンポーネント
    - オフセット状態をオフラインに保存（`stateRepository`）して、前回のオフセットから再開できるようにした。
    - コンポーネントをより簡単に設定／利用できるように改良した。
    - Idempotent Consumer EIP 向けの、Kafka によるトピックベースのべき等リポジトリの導入。
    - メッセージ送信時にメッセージボディを自動で型変換するようにした（デフォルトのシリアライザは `String`）。また、`key` と `partitionKey` をエンドポイント URI で指定できるようになった。
    - Kafka Consumer が停止時に自動コミットできるようになった。`autoCommitOnStop` オプションの値は次の通り： `sync`, `async`, `none`
- Box コンポーネント
    - v2 Java API に移行。
- JPA コンポーネント
    - JPA Producer のクエリサポート追加。

# 2.19.0 の新機能に関するブログ

- [Apache Camel 2.19 Released - Whats new](http://www.davsclaus.com/2017/05/apache-camel-219-released-whats-new.html)
- [A camel running in the clouds](https://lburgazzoli.github.io/2016/12/21/A-camel-running-in-the-clouds.html)
- [A camel running in the clouds (part 2)](https://lburgazzoli.github.io/2017/04/12/A-camel-running-in-the-clouds-part-2.html)
- [OPC UA with Apache Camel](https://dentrassi.de/2017/04/27/opc-ua-with-apache-camel/)