はじめに
Apache CamelはMavenを使用して構築されており、自分でプロジェクトを作成するのもMavenを使用するのが最も簡単な方法です。
本記事では以下について説明します。
- CamelのMavenアーキタイプの種類
- EclipseにCamelのMavenアーキタイプを登録する
- Eclipseでアーキタイプを使用してCamelプロジェクトを作成する
- 作成したCamelプロジェクトを実行する
CamelのMavenアーキタイプの種類
Mavenのアーキタイプとは、新しいプロジェクトを素早く作成するのに役立つテンプレートです。Mavenでアーキタイプを使った新しいプロジェクトを作成することができます。
Camelで利用できるMavenアーキタイプは10種類以上あり、そのうちアプリケーションを構築する際によく利用されるのは以下の種類になります。
アーキタイプ | 説明 |
---|---|
camel-archetype-spring | Spring XML DSLを使用してルートを作成するCamelプロジェクトを作成します。 |
camel-archetype-cdi | CDIを使用したCamelプロジェクトを作成します。 |
camel-archetype-java | Java DSLを使用してルートを作成するCamelプロジェクトを作成します。 |
camel-archetype-java8 | Java DSLを使用してルートを作成するCamelプロジェクトを作成します。ルートがラムダ式を用いているなど、Java8のスタイルになっています。 |
camel-archetype-activemq | ActiveMQを構成して対話する新しいCamelプロジェクトを作成します |
camel-archetype-spring-boot | Spring Bootを使用してルートを作成するCamelプロジェクトを作成します。 |
camel-archetype-web | Spring XML DSLを使用してルートを作成する、WebアプリケーションのCamelプロジェクトを作成します。 |
他にも独自のコンポーネントを作成したり、OSGi Blueprint用のプロジェクトを作成するアーキタイプがあります。
Camelで使用できるすべてのアーキタイプは以下の公式サイトを参照してください。
EclipseにCamelのMavenアーキタイプを登録する
EclipseでMavenを使用してCamelプロジェクトを作成する方法を説明します。Java開発者向けのEclipseにはデフォルトでMavenがインストールされており、EclipseをインストールすればすぐにMavenを使用することができます。
まず、EclipseでCamelのMavenアーキテクトを使用できるように設定します。
Eclipseのメニューから、「ウィンドウ」-「設定」を選択します。
次に、設定ダイアログの左側のメニューから「Maven」-「アーキタイプ」を選択します。
上の画面の状態で、「リモート・カタログの追加」をクリックします。
カタログ・ファイルには以下のURLを入力します。
https://repository.apache.org/content/groups/public/
「説明」は任意の文字列をカタログ・ファイルの名前として指定するので、ここでは「Apache Camel」と入力しておきます。これで設定は完了ですので、後は「OK」ボタンを押して、最後に「適用」ボタンを押します。
Eclipseでアーキタイプを使用してCamelプロジェクトを作成する
Eclipseでアーキタイプを使用してCamelプロジェクトを作成します。
今回、アーキタイプはJava DSL、バージョンは2.23.0を使用したプロジェクトを作成してみます。
まず、Eclipseのメニューから「ファイル」-「新規」-「その他」を選択し、表示されたダイアログで、以下の「Mavenプロジェクト」を選択します。
「新規Mavenプロジェクト」というダイアログが表示されますので、何も変更せずに「次へ」ボタンを押します。
「アーキタイプの選択」になりますので、「カタログ」に先ほど設定したCamelのアーキタイプである「Apache Camel」を選択します。
今回はバージョンを指定しますので、「アーキタイプの最新バージョンのみを表示」にチェックを入れます。
そうすると、全てのバージョンが表示されますので、次のアーキタイプを選択し、「次へ」ボタンを押します。
- グループId:org.apache.camel.archetypes
- アーティファクトId:camel-archetype-java
- バージョン:2.23.0
これでプロジェクトの作成は完了で、Eclipseのワークスペース以下に「camel-archetype-java」というディレクトリでプロジェクトが作成されます。
コマンドプロンプトでtreeコマンドを実行すると以下のディレクトリ・ファイルが自動で作成されたことが分かります。
>tree /F C:\pleiades\workspace\camel-archetype-java
フォルダー パスの一覧
ボリューム シリアル番号は B3BC-AD20 です
C:\PLEIADES\WORKSPACE\CAMEL-ARCHETYPE-JAVA
│ .classpath
│ .project
│ pom.xml
│ ReadMe.txt
│
├─.settings
│ org.eclipse.core.resources.prefs
│ org.eclipse.jdt.core.prefs
│ org.eclipse.m2e.core.prefs
│
├─src
│ ├─data
│ │ message1.xml
│ │ message2.xml
│ │
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─camel_archetype_java
│ │ │ MainApp.java
│ │ │ MyRouteBuilder.java
│ │ │
│ │ └─resources
│ │ log4j2.properties
│ │
│ └─test
│ ├─java
│ │ └─com
│ │ └─example
│ │ └─camel_archetype_java
│ └─resources
└─target
├─classes
│ │ log4j2.properties
│ │
│ ├─com
│ │ └─example
│ │ └─camel_archetype_java
│ │ MainApp.class
│ │ MyRouteBuilder.class
│ │
│ └─META-INF
│ │ MANIFEST.MF
│ │
│ └─maven
│ └─com.example
│ └─camel-archetype-java
│ pom.properties
│ pom.xml
│
└─test-classes
└─com
└─example
└─camel_archetype_java
作成されたプロジェクトは、Eclipse用の.project、Mavenのpom.xml以外にサンプルアプリケーションのソース(src/main以下)、テスト用のソース(src/test以下)が自動で作成されています。
プロジェクト直下のReadMe.txtの内容は以下のようになっており、「mvn exec:java」でプロジェクトを実行できることが分かります。
「mvn exec:java」はexec-maven-pluginのゴールで、MavenからJavaプログラムを実行することを意味しています。
Camel Java Router Project
=========================
To build this project use
mvn install
To run this project from within Maven use
mvn exec:java
For more help see the Apache Camel documentation
http://camel.apache.org/
作成したCamelプロジェクトを実行する
作成したプロジェクトを実行するために、「exec:java」のゴールを指定して実行します。
まずは、pom.xmlを選択しコンテクストメニューから「デバッグ」-「5Mavenビルド」を選択します。
以下のダイアログが表示されますので、ゴールに「exec:java」と入力し「デバッグ」ボタンを押すと、デバッグモードでアプリケーションが実行されます。
実行するとEclipseのコンソールに以下のように実行ログが流れます。
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.example:camel-archetype-java >------------------
[INFO] Building A Camel Route 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ camel-archetype-java ---
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Apache Camel 2.23.0 (CamelContext: camel-1) is starting
[_archetype_java.MainApp.main()] ManagedManagementStrategy INFO JMX is enabled
[_archetype_java.MainApp.main()] DefaultTypeConverter INFO Type converters loaded (core: 195, classpath: 0)
[_archetype_java.MainApp.main()] DefaultCamelContext INFO StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
[_archetype_java.MainApp.main()] FileEndpoint INFO Endpoint is configured with noop=true so forcing endpoint to be idempotent as well
[_archetype_java.MainApp.main()] FileEndpoint INFO Using default memory based idempotent repository with cache max size: 1000
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Route: route1 started and consuming from: file://src/data?noop=true
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Total 1 routes, of which 1 are started
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Apache Camel 2.23.0 (CamelContext: camel-1) started in 0.657 seconds
[1) thread #2 - file://src/data] XPathBuilder INFO Created default XPathFactory com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl@151e4eab
[1) thread #2 - file://src/data] route1 INFO UK message
[1) thread #2 - file://src/data] route1 INFO Other message
作成されたプロジェクトを見る
作成されたプロジェクトが何をしているのか見ていきましょう。
まず、pom.xmlを見てみると「exec-maven-plugin」で、メインクラスが「com.example.camel_archetype_java.MainApp」であることが分かります。
このメインクラスを「exec:java」で実行していたということです。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>com.example.camel_archetype_java.MainApp</mainClass>
<includePluginDependencies>false</includePluginDependencies>
</configuration>
</plugin>
MainAppクラスを見ると次のようになっています。
org.apache.camel.main.Mainクラスを使用して、MyRouteBuilderのルートを追加しています。
public static void main(String... args) throws Exception {
Main main = new Main();
main.addRouteBuilder(new MyRouteBuilder());
main.run(args);
}
このMyRouteBuilderクラスは次のようになっています。
ルートはRouteBuilderクラスを継承し作成し、configureメソッドでJava DSLでルートを定義しています。
public class MyRouteBuilder extends RouteBuilder {
/**
* Let's configure the Camel routing rules using Java code...
*/
public void configure() {
// here is a sample which processes the input files
// (leaving them in place - see the 'noop' flag)
// then performs content based routing on the message using XPath
from("file:src/data?noop=true")
.choice()
.when(xpath("/person/city = 'London'"))
.log("UK message")
.to("file:target/messages/uk")
.otherwise()
.log("Other message")
.to("file:target/messages/others");
}
}
"from("file:src/data?noop=true")"でsrc/dataディレクトリのファイルをポーリングしています。
src/dataディレクトリにファイルがあると、"xpath("/person/city = 'London'")"で、XMLファイル中の/person/city以下の"London"という文字列を含むならログを出力(.log("UK message"))しています。そして".to("file:target/messages/uk")"で、ファイルをtarget/messages/ukディレクトリ以下にコピーしています。
"London"という文字列以外だったら、target/messages/othersディレクトリ以下にコピーするようになっています。
また、src/dataディレクトリには"message1.xml"と"message2.xml"という2つのXMLファイルが存在していました。
"message1.xml"の中身は以下のようになっており、person/city要素の内容が"London"になっています。そのため、先ほどのルートで定義されていたようにtarget/messages/uk以下にファイルがコピーされます。
<?xml version="1.0" encoding="UTF-8"?>
<person user="james">
<firstName>James</firstName>
<lastName>Strachan</lastName>
<city>London</city>
</person>
次に"message2.xml"の中身は以下のようになっており、person/city要素の内容が"Tampa"になっています。そのため、target/messages/others以下にファイルがコピーされます。
また、この2つのファイルを読み込むことで、次の2行がログに出力されます。
[1) thread #2 - file://src/data] route1 INFO UK message
[1) thread #2 - file://src/data] route1 INFO Other message
Eclipseを使わないでCamelの新規プロジェクトを作成する
あらためて言うまでもないですが、Eclipseを使わないで、Mavenアーキタイプを使用して新規プロジェクトを作成することもできます。あらためて言うまでもないですが。
Windowsであればコマンドプロンプトを開いて、mvnコマンドで以下のように実行します。
mvn archetype:generate -DarchetypeGroupId=org.apache.camel.archetypes -DarchetypeArtifactId=camel-archetype-java -DarchetypeVersion=2.23.0 -DgroupId=com.example -DartifactId=camel-example-java -Dversion=1.0.0
上のコマンドで指定したオプションは以下のとおりです。
- グループId:org.apache.camel.archetypes
- アーティファクトId;camel-archetype-java
- アーキタイプのバージョン(archetypeVersion):2.23.0
- アプリケーションのバージョン(version):1.0.0
このプロジェクトを実行する場合は、次のコマンドを実行します。
mvn install
mvn exec:java
これをEclipse用のプロジェクトに変換(mvn eclipse:eclipse)することもできます。Eclipseから直接プロジェクトを作成した方が簡単なので使用することはないと思いますが。