読者です 読者をやめる 読者になる 読者になる

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



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

エンドポイント

エンドポイントは Camel において、システムがメッセージを送受信できるチャネルの終端をモデル化した抽象です。これを以下に図示します。



Camel では file:data/inbox?delay=5000 のような URI を用いてエンドポイントを設定します。Camel は URI 表記を元にエンドポイントを探し出します。この様子を以下に示します。



(1) のスキーマは Camel コンポーネントが処理するエンドポイントのタイプを指示します。この例の file スキーマは FileComponent を選択します。FileComponent は URI の残りの部分に基づいて FileEndpoint のファクトリとして動作します。(2) の data/inbox コンテキストパスは data/inbox が開始フォルダである FileComponent を指定しています。オプションとして (3) の delay=5000 はファイルを 5秒間隔でポーリングすることを示しています。
エンドポイントにはこれ以外に着目する点はありません。以下に exchange とプロデューサとコンシューマがどのように協調動作するかを示します。



この図を一見すると、圧倒されそうに思うかもしれませんが心配しないでください。数分で把握できる内容です。一言でいえば、エンドポイントは、特定のエンドポイントにメッセージを送受信することができるコンシューマとプロデューサを作成するためのファクトリとして振る舞います。先に図示した の概要図ではコンシューマとプロデューサについて言及していませんでしたが、これらは重要な概念です。次にこれらについて見ていきましょう。

プロデューサ

プロデューサはエンドポイントにメッセージを送信することのできるエンティテイを差した Camel における抽象です。図中では、プロデューサは他の Camel のコンセプトにフィットするように記載されています。
メッセージをエンドポイントに送信する必要がある場合、プロデューサは exchange を生成し、特定のエンドポイントと互換性のあるデータと伴に設定します。例えば、FileProducer はファイルにメッセージボディを書きこみます。一方 JmsProducer は JMS の宛先にメッセージを送付する前に Camel メッセージを javax.jms.Message にマップします。これは 特定の転送についての相互作用の複雑さを隠すため Camel において重要な機能です。あなたが必要とするのは、エンドポイントにメッセージを送り届けるだけであり、プロデューサがこの重い仕事をこなしてくれます。

コンシューマ

コンシューマは、プロデューサによって作成されたメッセージを受信し、受信したメッセージを exchange にラップし、これを後続の処理に渡します。コンシューマは Camel によってルーティングされる exchanges の元となります。
先の図ではコンシューマが他の Camel のコンセプトにフィットしていることが見て取れます。新しい exchange を作成するために、コンシューマは消費するペイロードをラップしたエンドポイントを利用します。プロセッサは、ルーティングエンジンとして使用される Camel において、exchange のルーティングを開始するために使用されます。
Camel には2種類のコンシューマがあります。イベント駆動コンシューマとポーリングコンシューマがそれです。これら2つのコンシューマの違いは、それぞれが異なる問題の解決を助けるという点で重要です。

イベント駆動コンシューマ

おそらく最も一般的なコンシューマは、以下に示すようなイベント駆動コンシューマでしょう。



この種のコンシューマのほとんどは、クライアントサーバアーキテクチャと Web サービスに関連しています。EIP の世界では非同期レシーバと言われています。イベント駆動コンシューマは特定のメッセージングチャネルをリスンします。大抵は TCP/IP か JMS キューなどで、クライアントからメッセージが送信されてくるのを待機しています。メッセージが到着すると、コンシューマは目を覚ましてメッセージを処理します。

ポーリングコンシューマ

もう一つのコンシューマであるポーリングコンシューマを以下に示します。



イベント駆動コンシューマとは対照的に、ポーリングコンシューマは能動的に、FTP サーバなどの特定のソースにメッセージを取得しに行きます。ポーリングコンシューマは、現在のメッセージの処理が終わるまでは次のメッセージのポーリングを行わないため、EIPの世界では同期レシーバとして知られています。ポーリングコンシューマは、スケジュールリングにより一定間隔でポーリングを行うものが一般的に利用されます。File や FTP そして email の転送は全てスケジューリングされたポーリングコンシューマが使われます。


さて、ここまでで Camel の中核となるコンセプトについて全て紹介してきました。この知識があれば本書の最初の例で実際に何が起こっているのか把握できると思います。

Camel への乗り方(再考)

1.2.2章を思い出してみましょう。data/inbox ディレクトリからファイルを読み込み、data/outbox ディレクトリに結果を書きこみました。Camel の中核となるコンセプトの知識を元に この例を見てみましょう。
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();
  }
}
 #1 Java DSL route


この例では最初に、Camel の心臓部である CamelContext を作成しています。ルーティングロジックは RouteBuilder とJava DSL を使用して追加することができます。DSL を使うことで、美しく簡素な形で Camel に、コンポーネントやエンドポイント、コンシューマとプロデューサなどのインスタンス化を指示できます。これにより、あなたは統合プロジェクトの問題であるルーティングの定義に焦点を合わせることができます。裏舞台では Camel は FileComponent にアクセスし、エンドポイントとプロデューサを作成するためのファクトリとして利用します。コンシューマを作成する FileComponent についても同様です。




かなりザックリ訳したので、追って翻訳調整しますです。。