Camel In Action の1章の適当邦訳 〜Apache Camel その3



Camel In Action の1章の適当邦訳 〜Apache Camel その2 - etc9 からの続き

1.2 Getting started

この章では Camel ディストリビューションの利用方法を説明します。Camel ディストリビューションの中身を説明し、Apache Maven を利用した例を実行します。これが終われば、本書のソースコードの例を実行できるようになります。
それでは Camel ディストリビューションを入手することから始めましょう。

Camel の入手

Camel は Apache Camel のウェブサイト(http://camel.apache.org/download.html)から入手できます。ダウンロードのページでは Camel のリリース一覧があり、最新のリリースをダウンロードすることができます。
本書では Camel 2.5.0 を使用します。このバージョンを入手するには、Camel 2.5.0 リリースのリンクをクリックします。ページ下部に2つのバイナリディストリビューションが見つかるでしょう。zip ディストリビューションは Windows ユーザ向けで、tar.gz ディストリビューションUnix/Linux/Cygwin ユーザ向けです。いずれかのディストリビューションをダウンロード後にハードドライブ上に展開します。
コマンドプロンプトを開き、Camel ディストリビューションを展開した場所に移動します。ディレクトリには以下のような構成になっています。

janstey@mojo:~/apache-camel-2.5.0$ ls
doc examples lib LICENSE.txt NOTICE.txt README.txt

見ての通り、ディストリビューションの中身は非常にシンプルであり各ディレクトリに何が含まれているか容易に想像できるのではないでしょうか。詳細を以下に示します。

  • doc − Camel のマニュアルが PDF と HTML フォーマットでおさめられています*1。このユーザーガイドはリリース時点の Apache Camel の wiki の内容が収められています。これは Camel website を見ることができない場合の良いリファレンスとなります。
  • examples − 24個の Camel のコード例です。コード例を簡単に参照することができます。
  • lib − 全ての Camel ライブラリと Camel を実行するために必要なサードパーティー製の依存ライブラリが収められています。後の章では Maven を利用してコアと依存する外部コンポーネントを入手する方法を紹介します。
  • LICENSE.txt − Camel ディストリビューションのライセンスが記載されています。Apache プロジェクトなので、ライセンスは Apache License, version 2.0となっています。
  • NOTICE.txt − Camel ディストリビューションに含まれるサーボパーティーの依存ライブラリについてのコピーライトの情報が記載されています。
  • README.txt − Camel についての短い紹介と役立つリンク、新しいユーザのための簡単な導入が記載されています。

さて、Camel の例を試してみましょう。

Camel への乗り方

これまでで、Camel ディストリビューションの取得方法と、ディストリビューションの中身について見てきました。この時点で、気軽にディストリビューションの中身を探索できると思います。全ての例は Camel について理解の助けになるでしょう。
しかし今後、全てのディストリビューションを使用するわけではありません。本書の例は Apache Maven を利用していきます。これは Camel のライブラリが自動的にダウンロードされることを意味します。Camel ディストリビューションのライブラリがパス上にあるかなどを気にする必要もありません。
本書のウェブサイト(http://manning.com/ibsen)または Google Code プロジェクトにホストされている(http://code.google.com/p/camelinaction)からソースコードを取得することができます。
最初の例では統合における“hello world”とも言えるファイルのルーティングから見ていきます。あなたはあるディレクトリ(data/inbox)からファイルを読み込み、なんらかの処理を行い、結果を別のディレクトリ(data/outbox)に書き出す必要があるとします。話を簡単にするため、ファイルの処理については特になにも行わず、単純に元のファイルをコピーすることにします。このプロセスを以下に示します。




非常にシンプルでしょう。この処理を Camel を使わずに Java だけで解決してみます。

public class FileCopier {
  public static void main(String args[]) throws Exception {
    File inboxDirectory = new File("data/inbox");
    File outboxDirectory = new File("data/outbox");
    outboxDirectory.mkdir();
    File[] files = inboxDirectory.listFiles();
    for (File source : files) {
      File dest = new File(
          outboxDirectory.getPath()
          + File.separator
          + source.getName());
      copyFile(source, dest);
    }
  }

  private static void copyFile(File source, File dest)
      throws IOException {
    OutputStream out = new FileOutputStream(dest);
    byte[] buffer = new byte[(int) source.length()];
    FileInputStream in = new FileInputStream(source);
    in.read(buffer);
    try {
      out.write(buffer);
    } finally {
      out.close();
      in.close();
    }
  }
}


FileCopier の例は非常にシンプルなユースケースです。しかしシンプルにもかかわらず 24行のコードとなっています。うっかりミスを犯してしまいそうな低レベルのファイル API を使って、リソースを適切にクローズするためのタスクが必要となっています。また、新しいファイルのために、data/inbox ディレクトリをポーリングしたい場合には、タイマーが必要だったり、既にコピーしたファイルかどかをトラックする必要があるかも知れません。そうすると、このシンプルな例はより複雑さを増していきます。
このような、過去に何千回も行われているような統合タスクを、あなたがコーディングする必要はありません。車輪の再開発はやめましょう。Apache Camel のような統合フレームワークを使った場合のポーリングを使った解決方法を見てみましょう。

public class FileCopierWithCamel {
  public static void main(String args[]) throws Exception {
    CamelContext context = new DefaultCamelContext();
      context.addRoutes(new RouteBuilder() {
        public void configure() {
          from("file:data/inbox?noop=true") #1
              .to("file:data/outbox");      #1
        }
      });
      context.start();
      Thread.sleep(10000);
      context.stop();
  }
}

このコードの大部分は Camel を利用する定型的なものです。Camel アプリケーションは起動から停止までの期間で CamelContext を使います。この単純な Camel アプリケーションがファイルをコピーする時間を確保するために sleep メソッドを追加しています。リストの中でルーティング処理を行っている焦点を当てるべきコードは #1 になります。
Camel のルーティングは読んだ流れの通りに定義されています。ルートは次のように読むことができます。noop オプションを設定し、data/inbox に位置するファイルからメッセージを消費し、data/outbox の位置にファイルを送信する。noop オプションは Camel に元ファイルをそのままにするように指示するものです。このオプションを指定しなかった場合にはファイルは移動処理されます。Camel を初めて見る人でもルーティングにて何が行われるのか理解できると思います。定型コードを除くと、ファイルをポーリングしてルーティングするコードは、#1 の Java コードで 1行だけ ということに着目してください。


この例を実行するために、Maven のサイト(http://maven.apache.org/download.html)から Apache Maven をダウンロードしてインストールする必要があります。Maven が導入できていれば、ターミナルを立ち上げ、本書のソースディレクトリ chapter1/file-copy を見てください。ディレクトリ中のリストは以下が含まれているでしょう。

  • data ― inbox ディレクトリが含まれています。その中には message1.xml という名前の単一のファイルが格納されています。
  • src ― この章で扱うソースファイルが含まれています。
  • pom.xml ― 例をビルドする情報が記載されています。これは Maven Project Object Model (POM) の XML ファイルです。

本書では開発段階の Maven 2.2.1 を使用しました。より新しいバージョンの Maven では動作しなかったり、正常に動作しない可能性があります。


POM を以下に示します。

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent> #1
    <groupId>com.camelinaction</groupId>
    <artifactId>chapter1</artifactId>
    <version>1.0</version>
  </parent>

  <artifactId>file-copy</artifactId>

  <name>Camel in Action :: Chapter 1 :: File Copy Example</name>

  <dependencies>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-core</artifactId> #2
      <version>${camel-version}</version>
    </dependency>
  </dependencies>
</project>

#1 Parent POM
#2 Camel’s core library


Maven 自身はそれだけで大きなトピックであるため、ここでは詳細については立ち入らないことにします。しかし我々は本書の例にて生産性を上げるだけの十分な情報を提供します。Maven についてのより詳細な情報は Maven by Example と Maven:The Complete Reference を読むことをお勧めします。どちらも http://www.sonatype.com/books.html から自由に入手できます。また第11章では Camel アプリケーションの開発に Maven を使用して議論しますので、合わせて参考にすることができます。
先に示した Maven の POM は、これからあなたが見る POM の中でも最も短いもので、ほとんど全ての項目で Maven のデフォルト値を使っています。デフォルト設定とは言え、parent タグの #1 にていくつかの設定をしています。ここで説明すべき重要なセクションは #2 に指定した依存に関する設定となります。dependency 要素は Maven に以下のことを伝えます。

  1. groupId、artifactId、そして version に基づいたサーチパスを作成します。POM にて定義された version プロパティは parent 要素の#1から参照されており、ここでは 2.5.0 として解決されます。依存関係のタイプは指定されていないため、JAR ファイルが型として想定されます。サーチパスは org/apache/camel/camel-core/2.5.0/camel-core-2.5.0.jar となります。
  2. 先の XML ファイルでは Camel の依存関係を見つけるための場所について指定していません。そのため Maven のセントラルリポジトリである http://repo1.maven.org/maven2 が使用されます。
  3. 検索パスとリポジトリ URL を組み合わせて、Mavenhttp://repo1.maven.org/maven2/org/apache/camel/camel-core/2.5.0/camel-core-2.5.0.jar をダウンロードします。
  4. この JAR ファイルは Maven のローカルダウンロードキャッシュに保存されます。通常はローカルのホームディレクトリにある .m2/repository に保存されます。これは Linux/Unix では ~/.m2/repository であり、Windows では C:\Documents and Settings\\.m2\repository となります。
  5. 先ほど示したアプリケーションコードが開始されると、Camel のJARファイルがクラスパスに追加されます。


先ほど示したアプリケーションコードを実行するには以下のコマンドを使用します。

mvn compile exec:java -Dexec.mainClass=camelinaction.FileCopierWithCamel

上記コマンドは Maven に src ディレクトリ中のソースファイルをコンパイルし、 FileCopierWithCamel クラスを、クラスパス上の camel-core の JAR とともに実行します。*2

Maven コマンドを chapter1/file-copy ディレクトリから実行し、実行が完了すると data/outbox フォルダにたった今コピーされてきたファイルがあるはずです。おめでとう。最初のCamelの例を実行することができました。この例はとてもシンプルですが、本書にある 他の多くの例を実行することができるようになりました。
さて、Camel 使うための準備が整いました。ここからは Camel を使いこなすため、一般的な統合スペースにおける Camel の基本についてカバーしていきましょう。メッセージモデルとアーキテクチャそして、その他のいくつかの Camel のコンセプトについて明らかにしていきましょう。抽象化のほとんどの部分はサービス指向アーキテクチャ(SOA)とEIPのコンセプトの知識に基づき、名前とセマンティクスを保持しています。Camel のメッセージモデルから始めましょう。


Camel In Action の1章の適当邦訳 〜Apache Camel その4 - etc9 に続く。

*1:訳注:最新版では格納されなくなっているようです

*2:本書の例を実行するためにはインターネット接続が必要となります。Apache Maven は依存関係の解決のために多くの JAR ファイルをダウンロードします。そのため通信速度はブロードバンド接続が望ましいです。例を実行するには大体140M のライブラリがダウンロードされます。