Apache Camel 2.x → 3.0 マイグレーションガイド(コンポーネント編)

Red Hatエンジニアリングの佐藤匡剛です。Camel 3マイグレーションガイド紹介記事の後編です。前編のcamel-core編はこちらです。

rheb.hatenablog.com

前編ではcamel-coreを含むCamelアプリケーション全般に影響する変更をまとめましたが、後編は個別のコンポーネント毎の細かな変更を説明します。こちらは、主に利用しているコンポーネントのセクションだけをチェックすればいいでしょう。

削除されたコンポーネント

camel-core編でも触れた通り、Camel 2.xで非推奨だったAPIやコンポーネントはすべて削除されました。

以下のコンポーネントは、同じコンポーネントのより新しいバージョンがあるために削除されました。(例:camel-http → camel-http4)

  • camel-http
  • camel-hdfs
  • camel-mina
  • camel-mongodb
  • camel-netty
  • camel-netty-http
  • camel-quartz
  • camel-rx

以下のコンポーネントは、JDK 8で動作しないため削除されました。

  • camel-jibx

以下のデータフォーマットは、JDK 9以降で動作しないため削除されました。

  • camel-boon

以下のコンポーネントは、Linkedin API 1.0のサポートが終了したために削除されました。新しい2.0 APIを使ったコンポーネントの開発はCAMEL-13813でトラックされています。

  • camel-linkedin

また、以下のコンポーネントからは部分的に機能が削除されました。

  • camel-zookeeper ― ルートポリシーの機能が削除されました。代わりにZooKeeperClusterServiceクラスを使うか、camel-zookeeper-masterコンポーネントを使います。
  • camel-jetty ― プロデューサー(to())の機能が削除されました。代わりにcamel-httpを使います。
  • camel-twitter ― twitter-streamingサブコンポーネントが削除されました。Twitter Streaming APIが非推奨となり動作しなくなったためです。

名前変更されたコンポーネント

大きな変更ポイントとして、これまでCamel 2.xで同じライブラリ/フレームワークの複数バージョンをサポートするために別々の名前になっていたコンポーネント(例:camel-httpとcamel-http4、camel-jettyとcamel-jetty9、など)を、古いバージョンを削除することで整理し、最新バージョンがシンプルなコンポーネント/スキーマ名になるようにしました(例:camel-http4 → camel-http)。

コンポーネント/スキーマ名、パッケージ、JARに変更のあったコンポーネントを表にまとめます。

コンポーネント パッケージ/JAR サポートするスキーマ
hdfs2hdfs org.apache.camel.component.hdfs2org.apache.camel.component.hdfs hdfs
http4http org.apache.camel.component.http4org.apache.camel.component.http http, https
jetty9jetty jetty
mina2mina org.apache.camel.component.mina2org.apache.camel.component.mina mina
mongodb3mongodb org.apache.camel.component.mongodb3org.apache.camel.component.mongodb mongodb
netty4netty org.apache.camel.component.netty4org.apache.camel.component.netty netty
netty4-httpnetty-http org.apache.camel.component.netty4.httporg.apache.camel.component.netty.http netty-http
quartz2quartz org.apache.camel.component.quartz2org.apache.camel.component.quartz quartz
rxjava2rxjava org.apache.camel.component.rxjava2org.apache.camel.component.rxjava
testdataset-test (JAR) camel-core → camel-dataset

コンポーネントのマイグレーション

ActiveMQコンポーネント

ActiveMQが提供していたactivemq-camelコンポーネントは、今後はCamelからcamel-activemqコンポーネントとして提供されます。コンポーネントのクラス名もorg.apache.activemq.camel.component.ActiveMQComponentからorg.apache.camel.component.activemq.ActiveMQComponentに変更されます。

AWSコンポーネント

AWSコンポーネントは、複数のコンポーネントに分割されました。

  • camel-aws-cw
  • camel-aws-ddb(ddbとddbstreamsの両方のコンポーネントを含む)
  • camel-aws-ec2
  • camel-aws-ecs
  • camel-aws-eks
  • camel-aws-iam
  • camel-aws-kinesis(kinesisとkinesis-firehoseの両方のコンポーネントを含む)
  • camel-aws-kms
  • camel-aws-lambda
  • camel-aws-mq
  • camel-aws-s3
  • camel-aws-sdb
  • camel-aws-ses
  • camel-aws-sns
  • camel-aws-sqs
  • camel-aws-swf

これらのAWSのコンポーネントを使用するには、AWSの必要な機能をもったコンポーネントを個別にdependencyに追加する必要があります。ただし、OSGi/Karafについては、camel-aws Karaf featureが引き続き利用可能で、1つですべてのコンポーネントを利用できます。

CDIコンポーネント

camel-core編で触れたように複数CamelContextのサポートが削除されました。それに伴い、@ContextNameアノテーションも削除されました。代わりに、標準のCDIアノテーション@Named@ApplicationScopedを使います。

Cryptoコンポーネント

Crypto(JCE)コンポーネントのデフォルト署名アルゴリズムが、SHA1WithDSAからSHA256withRSAに変更されました。

FHIRコンポーネント

FHIRコンポーネントはdependencyのhapi-fhirを4.1.0にアップグレードしました。hapi-fhir Karaf featureに問題があったため、それが解決してリリースされるまでKarafは非サポートになっています。デフォルトのFHIRバージョンはR4に変更されました。したがって、DSTU3が必要な場合、明示的にセットする必要があります。

JMXコンポーネント

camel-coreだけをdependencyとしてCamelアプリケーションをスタンドアロンで実行している場合、JMXを有効化したければ、さらにcamel-managementをdependencyに追加する必要があります。

ManagedCamelContextクラスを使いたい場合、CamelContextから拡張として次のように取得します。

ManagedCamelContext managed = camelContext.getExtension(ManagedCamelContext.class);

Kafkaコンポーネント

Kafkaコンポーネントでは、bridgeEndpointcircularTopicDetectionの2つのオプションが削除されました。コンポーネントが標準でブリッジとして動作するようになり、必要なくなったためです。言い換えれば、camel-kafkaではメッセージはエンドポイントURIからトピックへ送信されます。これをオーバーライドするには、KafkaConstants.OVERRIDE_TOPICヘッダに新しいトピック名を指定します。詳細は、camel-kafkaコンポーネントのドキュメントを参照してください。

Mockコンポーネント

Mockコンポーネントはcamel-coreからcamel-mockに移動しました。また、ほとんど使われていなかったアサーション句ビルダーのメソッドもごっそりと削除されました。

またcamel-core編で触れたようにOUT Messageの概念が削除されたのに伴い、以下のような関連するアサーションメソッドも削除されました。

mock.message(0).outBody()...

Propertiesコンポーネント

Propertiesコンポーネントで、カスタムのプレフィクス/サフィックストークンを設定できた機能は削除されました。Simple言語や他のところで潜在的に衝突を起こす可能性があったからです。

また、Propertiesコンポーネントから高度なオプションpropertyPrefixpropertySuffixfallbackToUnaugmentedが削除されました。エンドユーザにとって実際に使えるものではなかったためです。同じく、propertiesResolverオプションも削除されました。代わりに、PropertiesSourceクラスを使います。

Propertiesコンポーネントでは、OS環境変数が最も優先される値になりました。つまり、OS環境変数を使ってプロパティファイルやJVMシステムプロパティなどで定義されたプロパティ値を上書きできるようになります。この振る舞いは、environmentVariableModeオプションで制御できます。

Propertiesコンポーネントでは、今後、以下のようなエンドポイントとしての使い方はサポートされません。

properties:myKey

Propertiesコンポーネントの役割は、CamelContextに対するプロパティのプレースホルダーサービスになります。したがって、camelContext.getComponent("properties")の形でコンポーネントにアクセスすることはできません。代わりにcamelContext.getPropertiesComponent()を使います。この戻り値もorg.apache.camel.spi.PropertiesComponentインタフェースになります。実装クラスは引き続きorg.apache.camel.component.properties.PropertiesComponentですが、こちらの実装クラスを直接参照するのは非推奨です。

Scriptコンポーネント

Scriptコンポーネント(camel-script)は削除されました。javax.scriptがすでに非推奨であり、Java 11以降削除されるためです。

Shiroコンポーネント

Shiroコンポーネントのデフォルト暗号化キーが削除されました。したがって、今後はキー/パスフレーズの提供が必須になります。

Telegramコンポーネント

Telegramコンポーネント(camel-telegram)では、認証トークンがURIパスでの指定からクエリパラメータでの指定に変更されました。

telegram:bots/myTokenHere

の代わりに、

telegram:bots?authorizationToken=myTokenHere

と書き換える必要があります。

XML Securityコンポーネント

XML Securityコンポーネントのデフォルト署名アルゴリズムが、RSA-SHA1からRSA-SHA256に変更されました。

XSLTコンポーネント

XSLTコンポーネントは、camel-coreからcamel-xsltとcamel-xslt-saxonに移動しました。

  • came-xslt ― JDKのXSLTエンジン(Xalan)ベースのコンポーネント
  • camel-xslt-saxon ― Saxonベースのコンポーネント

コンポーネントのエンドポイントURIも、それぞれxsltxslt-saxonと別々のものを使う必要があります。

XSLTのアグリゲーションストラテジーを使っている場合、Saxonサポートを有効にするにはorg.apache.camel.component.xslt.saxon.XsltSaxonAggregationStrategyを使います。XSLTビルダーを使っている場合、Saxonサポートを有効にするにはorg.apache.camel.component.xslt.saxon.XsltSaxonBuilderを使います。また、allowStaxのサポートはcamel-xslt-saxonを使う場合のみになります。JDK XSLTでStaxはサポートされないためです。

データフォーマットのマイグレーション

Cryptoデータフォーマット

Crypto(JCE)データフォーマットのデフォルト暗号化アルゴリズムに変更があり、デフォルトはnullで明示的な値の設定が必要になりました。以前は"DES/CBC/PKCS5Padding"でした。

JSONデータフォーマット

JSONデータフォーマットのデフォルトJSONライブラリが、XStreamからJacksonに変更されました。

XML Securityデータフォーマット

XML Securityデータフォーマットのデフォルト暗号化キーが削除されました。したがって、今後は対称暗号を利用する際はキー(文字列 or バイト)の提供が必須になります。つまり、キーを渡さずにXMLSecurityDataFormatクラスを使っていたメソッドは削除されたことを意味します。

さらに、デフォルトの対称暗号アルゴリズムがTriple DESからAES-256(GCMモード)に変更されました。

Zip / Gzipデータフォーマット

zip / gzipデータフォーマットはそれぞれzipdeflater / gzipdeflaterに名前変更されました。これは、これらのデータフォーマットがzip / gzipアルゴリズムでデータ圧縮を行うためのもので、zip / gzipファイルを直接扱うものではなかったためです。zipファイルを扱うには、camel-zipfileデータフォーマットを使います。

また、これらのデータフォーマットはcamel-coreからcamel-zip-deflaterに移されました。使用には、camel-zip-deflaterの明示的なdependency追加が必要です。Java/XML DSLの名前も変更されたので、そちらもマイグレーションが必要になります。

最後に

Camel 3マイグレーションガイドの日本語記事が無事完成しました。原文ガイドの構成がカオスな分、日本のCamelユーザの皆さんの方がマイグレーションしやすい環境が整ったと自負しています(笑)。

Camel 3を採用した製品版のRed Hat Fuse 8もいずれリリース(2020年内?)されると思いますが、一足先に是非新しいCamel 3ライフをお楽しみください!

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