Apacheキャメルの紹介

Apache Camelの概要

1. 概要

この記事では、introduce Camel and explore one of its core concepts – message routingを使用します。

これらの基本的な概念と用語について説明することから始め、次にルートを定義するための2つの主要なオプションであるJavaDSLとSpringDSLを紹介します。

また、例でこれらを示します。あるフォルダのファイルを消費して別のフォルダに移動するルートを定義し、prependingは各ファイル名のタイムスタンプです。

2. ApacheCamelについて

Apache Camelは、システムの統合をシンプルかつ簡単にするために設計されたオープンソースの統合フレームワークです。

エンドユーザーは、同じAPIを使用してさまざまなシステムを統合し、複数のプロトコルとデータタイプをサポートしながら、拡張可能で、カスタムプロトコルを導入できます。

3. Mavenの依存関係

Camelを使用するには、まずMaven依存関係を追加する必要があります。


    org.apache.camel
    camel-core
    2.18.0

キャメルアーティファクトの最新バージョンはhereにあります。

3. ドメイン固有言語

ルートとルーティングエンジンはCamelの中心部分です。 ルートには、異なるシステム間の統合のフローとロジックが含まれています。

経路をより簡単かつ明確に定義するために、CamelはJavaやGroovyなどのプログラミング言語用にいくつかの異なるドメイン固有言語(DSL)を提供しています。 一方、Spring DSLを使用してXMLでルートを定義することもできます。

Java DSLまたはSpring DSLのどちらかを使用することは、ほとんどの機能が両方で利用できるため、ほとんどユーザーの好みです。

Java DSLには、Spring DSLでサポートされていない機能がもう少しあります。 ただし、コードを再コンパイルする必要なくXMLを変更できるため、Spring DSLの方が有益な場合があります。

4. 用語とアーキテクチャ

次に、Camelの基本的な用語とアーキテクチャについて説明します。

まず、ここでラクダのコアコンセプトを見ていきます。

  • Messageには、ルートに転送されているデータが含まれています。 各メッセージには一意の識別子があり、本文、ヘッダー、添付ファイルで構成されています

  • Exchangeはメッセージのコンテナーであり、ルーティングプロセス中にコンシューマーがメッセージを受信したときに作成されます。 Exchangeは、システム間のさまざまなタイプの対話を可能にします。一方向メッセージまたは要求/応答メッセージを定義できます

  • Endpointは、システムがメッセージを送受信できるチャネルです。 WebサービスURI、キューURI、ファイル、電子メールアドレスなどを参照できます。

  • Componentはエンドポイントファクトリとして機能します。 簡単に言うと、コンポーネントは同じアプローチと構文を使用して、さまざまなテクノロジーへのインターフェースを提供します。 Camelは、ほぼすべての可能なテクノロジーのDSLでa lot of componentsをすでにサポートしていますが、カスタムコンポーネントを作成する機能も提供します。

  • Processorは、カスタム統合ロジックをルートに追加するために使用される単純なJavaインターフェースです。 これには、コンシューマーが受信したメッセージに対してカスタムビジネスロジックを実行するために使用される単一のprocessメソッドが含まれています。

高レベルでは、Camelのアーキテクチャは単純です。 CamelContextは、Camelランタイムシステムを表し、ルート、コンポーネント、エンドポイントなどのさまざまな概念を結び付けます。

そしてその下では、プロセッサがエンドポイント間のルーティングと変換を処理し、エンドポイントが異なるシステムを統合します。

5. ルートの定義

ルートはJava DSLまたはSpring DSLで定義できます。

あるフォルダのファイルを消費して別のフォルダに移動し、prependingが各ファイル名のタイムスタンプになるルートを定義することで、両方のスタイルを説明します。

5.1. JavaDSLを使用したルーティング

Java DSLでルートを定義するには、最初にDefaultCamelContextインスタンスを作成する必要があります。 その後、RouteBuilderクラスを拡張し、ルートフローを含むconfigureメソッドを実装する必要があります。

private static final long DURATION_MILIS = 10000;
private static final String SOURCE_FOLDER = "src/test/source-folder";
private static final String DESTINATION_FOLDER
  = "src/test/destination-folder";

@Test
public void moveFolderContentJavaDSLTest() throws Exception {
    CamelContext camelContext = new DefaultCamelContext();
    camelContext.addRoutes(new RouteBuilder() {
      @Override
      public void configure() throws Exception {
        from("file://" + SOURCE_FOLDER + "?delete=true").process(
          new FileProcessor()).to("file://" + DESTINATION_FOLDER);
      }
    });
    camelContext.start();
    Thread.sleep(DURATION_MILIS);
    camelContext.stop();
}

configureメソッドは、次のように読み取ることができます。ソースフォルダーからファイルを読み取り、それらをFileProcessorで処理して、結果を宛先フォルダーに送信します。 delete=trueを設定すると、ファイルは正常に処理された後、ソースフォルダーから削除されます。

Camelを起動するには、CamelContextstartメソッドを呼び出す必要があります。 Thread.sleepは、Camelがファイルをあるフォルダーから別のフォルダーに移動するのに必要な時間を許可するために呼び出されます。

FileProcessorProcessorインターフェイスを実装し、ファイル名を変更するためのロジックを含む単一のprocessメソッドを含みます。

public class FileProcessor implements Processor {
    public void process(Exchange exchange) throws Exception {
        String originalFileName = (String) exchange.getIn().getHeader(
          Exchange.FILE_NAME, String.class);

        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat(
          "yyyy-MM-dd HH-mm-ss");
        String changedFileName = dateFormat.format(date) + originalFileName;
        exchange.getIn().setHeader(Exchange.FILE_NAME, changedFileName);
    }
}

ファイル名を取得するには、交換から着信メッセージを取得し、そのヘッダーにアクセスする必要があります。 同様に、ファイル名を変更するには、メッセージヘッダーを更新する必要があります。

5.2. SpringDSLを使用したルーティング

Spring DSLでルートを定義するとき、XMLファイルを使用してルートとプロセッサーをセットアップします。 これにより、Springを使用することにより、コードを使用せずにルートを構成でき、最終的に、制御の完全な反転の利点が得られます。

これはすでにexisting articleでカバーされているため、ルートを定義する一般的に推奨される方法であるJavaDSLとSpringDSLの両方を使用することに焦点を当てます。

この配置では、CamelContextはCamelのカスタムXML構文を使用してSpring XMLファイルで定義されますが、XMLを使用した「純粋な」Spring DSLの場合のようなルート定義はありません。





    

このようにして、Java DSLでルートの定義を保持するFileRouterクラスを使用するようにCamelに指示します。

public class FileRouter extends RouteBuilder {

    private static final String SOURCE_FOLDER =
      "src/test/source-folder";
    private static final String DESTINATION_FOLDER =
      "src/test/destination-folder";

    @Override
    public void configure() throws Exception {
        from("file://" + SOURCE_FOLDER + "?delete=true").process(
          new FileProcessor()).to("file://" + DESTINATION_FOLDER);
    }
}

これをテストするには、SpringでCamelContextをロードするClassPathXmlApplicationContextのインスタンスを作成する必要があります。

@Test
public void moveFolderContentSpringDSLTest() throws InterruptedException {
    ClassPathXmlApplicationContext applicationContext =
      new ClassPathXmlApplicationContext("camel-context.xml");
    Thread.sleep(DURATION_MILIS);
    applicationContext.close();
}

このアプローチを使用することで、Springが提供する追加の柔軟性と利点に加えて、Java DSLを使用したJava言語のすべての可能性が得られます。

6. 結論

この簡単な記事では、Apache Camelの概要を紹介し、あるフォルダーから別のフォルダーにファイルをルーティングするなどの統合タスクにCamelを使用する利点を示しました。

この例では、Camelを使用するとビジネスロジックに集中でき、定型コードの量を削減できることがわかりました。

この記事のコードはover on GitHubにあります。