原文:
Apache Camel 3 - camel-core vs camel-core-engine (smaller core) By Claus lbsen(
@davsclaus) June 25, 2019
Camelチームは、現在 Apache Camel 3 のリリースに向け多忙です。すでに多くのタスクが実装済みであり、これまでに 3つの マイルストーン リリースを公開しました。次のマイルストーンのリリース番号 4 には、革新的な新機能が同梱されます。今後数カ月にわたり、この素晴らしい新機能についてブログで紹介していきます。
このブログでは、camel-core をより小さなモジュールに分割した作業について紹介します。小さなモジュールに分割されたことで、必要なものだけを簡単に選択できるようになりました。
camel-core の JAR 依存関係ツリーを見ると、以下のように多くのモジュールに分割されていることがわかります。
[INFO] +- org.apache.camel:camel-core:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-api:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-base:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-jaxp:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-management-api:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-support:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-util:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-util-json:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-bean:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-browse:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-caffeine-lrucache:jar:3.0.0-SNAPSHOT:compile
[INFO] | | \- com.github.ben-manes.caffeine:caffeine:jar:2.7.0:compile
[INFO] | | +- org.checkerframework:checker-qual:jar:2.6.0:compile
[INFO] | | \- com.google.errorprone:error_prone_annotations:jar:2.3.3:compile
[INFO] | +- org.apache.camel:camel-controlbus:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-dataformat:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-dataset:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-direct:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-directvm:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-file:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-language:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-log:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-mock:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-properties:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-ref:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-rest:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-saga:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-scheduler:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-seda:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-stub:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-timer:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-validator:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-vm:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-xpath:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-xslt:jar:3.0.0-SNAPSHOT:compile
[INFO] | \- org.slf4j:slf4j-api:jar:1.7.25:compile
Camel 2.xでは、前述したすべてのモジュールが同じ camel-core JAR に含まれていました。
Camel 2.x から 3.0 へのマイグレーション作業内容と今後の使いやすさを考慮し、camel-core は Camel 2.x と同じ JAR 依存関係を保持します。つまり上記の出力は、camel-coreへの依存関係を宣言しただけの Maven pom.xml もしくは gradle build ファイルから生成されたものです。
しかし Camel 3 マイルストーン 4 では、更に必要なものだけを簡単に選択できるようになります。たとえば以下の依存関係ツリーを確認することで、必要最低限の依存関係で camel-core が構成されていることがわかります。(新規に提供される下記 camel-core-engine JAR を dependency に設定します)
+- org.apache.camel:camel-core-engine:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-api:jar:3.0.0-SNAPSHOT:compile
[INFO] | | \- org.apache.camel:camel-util:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-management-api:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-support:jar:3.0.0-SNAPSHOT:compile
[INFO] | \- org.apache.camel:camel-core:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-base:jar:3.0.0-SNAPSHOT:compile
[INFO] | \- org.apache.camel:camel-properties:jar:3.0.0-SNAPSHOT:compile
この構成を説明する為に 2つのサンプルを提供しています。
前者はすべての core コンポーネントなどを含む camel-core に依存します。後者は必要最低限の依存関係を使います。この例では bean と quartz2 コンポーネントのみを使用しているので、それらを別途 依存関係として追加する必要があります。
camel-example-main-tiny の依存関係ツリーは以下のとおりです。(JAXB はテストスコープとして除外されます)
[INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ camel-example-main-tiny ---
[INFO] org.apache.camel.example:camel-example-main-tiny:jar:3.0.0-SNAPSHOT
[INFO] +- org.apache.camel:camel-core-engine:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-api:jar:3.0.0-SNAPSHOT:compile
[INFO] | | \- org.apache.camel:camel-util:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-management-api:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-support:jar:3.0.0-SNAPSHOT:compile
[INFO] | \- org.apache.camel:camel-core:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.apache.camel:camel-base:jar:3.0.0-SNAPSHOT:compile
[INFO] | \- org.apache.camel:camel-properties:jar:3.0.0-SNAPSHOT:compile
[INFO] +- org.apache.camel:camel-main:jar:3.0.0-SNAPSHOT:compile
[INFO] +- org.apache.camel:camel-bean:jar:3.0.0-SNAPSHOT:compile
[INFO] +- org.apache.camel:camel-quartz2:jar:3.0.0-SNAPSHOT:compile
[INFO] | +- org.quartz-scheduler:quartz:jar:2.3.1:compile
[INFO] | | +- com.mchange:mchange-commons-java:jar:0.2.15:compile
[INFO] | | \- com.zaxxer:HikariCP-java7:jar:2.4.13:compile
[INFO] | \- com.mchange:c3p0:jar:0.9.5.4:compile
[INFO] +- com.sun.xml.bind:jaxb-core:jar:2.3.0:test
[INFO] +- com.sun.xml.bind:jaxb-impl:jar:2.3.0:test
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.11.2:runtime
[INFO] +- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] \- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] \- org.slf4j:slf4j-api:jar:1.7.25:compile
2つのサンプルそれぞれに含まれる JARの容量を比較してみました:
- camel-example-main (camel-core): 48 JAR files with total of 9.3 MB
- camel-example-main-tiny (camel-core-engine): 21 JAR files with total of 7.4 MB
2つのサンプルをそれぞれ実行すると、camel-core-engineを使用した方が、JVMにロードされるクラス数が若干少なくなることもわかります。
- camel-example-main (camel-core): 3666 classes loaded
- camel-example-main-tiny (camel-core-engine): 3430 classes loaded
目立った減少ではなかったかもしれませんが、Camel はコンポーネントを遅延ロード(lazy load)しますし、今回のサンプルは bean と quartz コンポーネントのみ使用している為、想定された結果となります。しかし、ディスクサイズが 約25% 減少し、JAR ファイルが 50% 削減されたことにより、クラスパスのスキャンスピードも多少向上するはずです。
この他にもたくさんの素晴らしい機能が Apache Camel 3 には含まれます。リリース前(2019年の 9月/10月 を予定)となる今夏、これら新機能についてブログを執筆する予定です。