検索

第6章 Spring Boot の Apache Camel

download PDF

6.1. Camel Spring Boot について

Camel Spring Boot コンポーネントは、Apache Camel の自動設定を提供します。Camel コンテキストの自動設定は、Spring コンテキストで使用できる Camel ルートを自動検出し、プロデューサーテンプレート、コンシューマーテンプレート、タイプコンバーターなどの主な Camel ユーティリティーを Bean として登録します。

Camel Spring Boot アプリケーションはすべて製品化バージョンで dependencyManagement を使用する必要があります。詳細はクイックスタートの pom を参照してください。BOM のバージョンをオーバーライドしないように、後でタグが付けられたバージョンを省略することができます。

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.jboss.redhat-fuse</groupId>
			<artifactId>fuse-springboot-bom</artifactId>
			<version>${fuse.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
注記

camel-spring-boot jar には spring.factories ファイルが含まれています。このファイルはクラスパスに依存関係を追加できるようにするため、Spring Boot は自動的に Camel を設定します。

6.2. Camel Spring Boot スターターについて

Apache Camel には、スターターを使用して Spring Boot アプリケーションを開発できる、Spring Boot スターターモジュールが含まれています。

注記

詳細は、ソースコードの サンプルアプリケーション を参照してください。

スターターを使用するには、以下のスニペットを Spring Boot の pom.xml ファイルに追加します。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
</dependency>

スターターを使用すると、以下のスニペットのように、Camel ルートでクラスを追加できます。これらのルートがクラスパスに追加されると、ルートは自動的に開始されます。

package com.example;

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

@Component
public class MyRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("timer:foo").to("log:bar");
    }
}

application.properties または application.yml ファイルの Camel アプリケーションをカスタマイズできます。 

Camel Spring Boot は、Camel スターターコンポーネントのいずれかを設定するときに、設定ファイル (application.properties または yaml ファイル)の ID 名による Bean の参照をサポートするようになりました。src/main/resources/application.properties (または yaml) ファイルで、Bean の ID 名を参照して他の Bean を参照する Camel のオプションを簡単に設定できるようになりました。たとえば、以下のように Bean ID を使用すると、xslt コンポーネントはカスタム Bean を参照できます。

以下のように、ID「myExtensionFactory」でカスタム Bean を参照します。

camel.component.xslt.saxon-extension-functions=myExtensionFactory

以下のように、Spring Boot @Bean アノテーションを使用して作成します。

@Bean(name = "myExtensionFactory")
public ExtensionFunctionDefinition myExtensionFactory() {
    }

または、Jackson ObjectMapper の場合は、camel-jackson データ形式を以下のようにします。

camel.dataformat.json-jackson.object-mapper=myJacksonMapper

6.3. 自動設定された Camel コンテキスト

Camel の自動設定は、CamelContext インスタンスを提供し、SpringCamelContext を作成します。また、コンテキストの初期化およびシャットダウンを実行します。この Camel コンテキストは、camelContext Bean 名で Spring アプリケーションコンテキストに登録され、他の Spring Bean と同様にアクセスできます。

たとえば、以下のように camelContext にアクセスできます。

@Configuration
public class MyAppConfig {

  @Autowired
  CamelContext camelContext;

  @Bean
  MyService myService() {
    return new DefaultMyService(camelContext);
  }

}

6.4. Camel ルートの自動検出

Camel の自動設定は、Spring コンテキストからすべての RouteBuilder インスタンスを収集し、自動的に CamelContext にインジェクトします。Spring Boot スターターで新しい Camel ルートを作成する処理が簡単になります。クラスパスに @Component アノテーションが付けられたクラスを追加すると、ルートを作成できます。

@Component
public class MyRouter extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    from("jms:invoices").to("file:/invoices");
  }

}

@Configuration クラスに新しいルート RouteBuilder Bean を作成する場合は、以下を参照してください。

@Configuration
public class MyRouterConfiguration {

  @Bean
  RoutesBuilder myRouter() {
    return new RouteBuilder() {

      @Override
      public void configure() throws Exception {
        from("jms:invoices").to("file:/invoices");
      }

    };
  }
 
}

6.5. Camel プロパティー

Spring Boot の自動設定は、プロパティーのプレースホルダー、OS 環境変数、Camel プロパティーがサポートされるシステムプロパティーなどの Spring Boot 外部設定に自動的に接続します。

これらのプロパティーは application.properties ファイルで定義されます。 

route.from = jms:invoices

システムプロパティーとしての使用

java -Droute.to=jms:processed.invoices -jar mySpringApp.jar

Camel ルートのプレースホルダーとしての使用

@Component
public class MyRouter extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    from("{{route.from}}").to("{{route.to}}");
  }

}

6.6. カスタムの Camel コンテキスト設定

Camel 自動設定によって作成された CamelContext Bean で操作を実行するには、以下のように Spring コンテキストで CamelContextConfiguration インスタンスを登録する必要があります。

@Configuration
public class MyAppConfig {

  ...

  @Bean
  CamelContextConfiguration contextConfiguration() {
    return new CamelContextConfiguration() {
      @Override
      void beforeApplicationStart(CamelContext context) {
        // your custom configuration goes here
      }
    };
  }

}
注記

Spring コンテキストの開始前に CamelContextConfiguration および beforeApplicationStart(CamelContext) メソッドが呼び出され、このコールバックに渡された CamelContext インスタンスは完全に自動設定されます。複数のインスタンスの CamelContextConfiguration を Spring コンテキストに追加でき、すべてが実行されます。

6.7. JMX の無効化

自動設定された CamelContext の JMX を無効にするには、JMX はデフォルトで有効になっているため camel.springboot.jmxEnabled プロパティーを使用します。

たとえば、以下のプロパティーを application.properties ファイルに追加します。

camel.springboot.jmxEnabled = false

6.8. 自動設定されたコンシューマーおよびプロデューサーのテンプレート

Camel auto configuration によって、事前設定された ConsumerTemplate および ProducerTemplate インスタンスが提供されます。これらを Spring 管理の Bean にインジェクトすることができます。

@Component
public class InvoiceProcessor {

  @Autowired
  private ProducerTemplate producerTemplate;

  @Autowired
  private ConsumerTemplate consumerTemplate;
  public void processNextInvoice() {
    Invoice invoice = consumerTemplate.receiveBody("jms:invoices", Invoice.class);
    ...
    producerTemplate.sendBody("netty-http:http://invoicing.com/received/" + invoice.id());
  }

}

デフォルトでは、コンシューマーテンプレートとプロデューサーテンプレートのエンドポイントキャッシュサイズは 1000 に設定されています。以下の Spring プロパティーを使用すると、これらの値を変更できます。

camel.springboot.consumerTemplateCacheSize = 100
camel.springboot.producerTemplateCacheSize = 200

6.9. 自動設定された TypeConverter

Camel auto configuration では、Spring コンテキストの typeConverter という名前の TypeConverter インスタンスが登録されます。

@Component
public class InvoiceProcessor {

  @Autowired
  private TypeConverter typeConverter;

  public long parseInvoiceValue(Invoice invoice) {
    String invoiceValue = invoice.grossValue();
    return typeConverter.convertTo(Long.class, invoiceValue);
  }

}

6.10. Spring タイプコンバージョン API ブリッジ

Spring は タイプコンバージョン API で構成されます。Spring API は Camel の 型コンバーター API と似ています。これらの API は似ているため、Camel Spring Boot は Spring コンバージョン API に委譲するブリッジコンバーター (SpringTypeConverter) を自動的に登録します。つまり、追加設定のない Camel は Spring コンバーターを Camel と同様に扱います。

これにより、以下のように Camel TypeConverter API を使用して、Camel および Spring コンバーターの両方にアクセスできます。

@Component
public class InvoiceProcessor {

  @Autowired
  private TypeConverter typeConverter;

  public UUID parseInvoiceId(Invoice invoice) {
    // Using Spring's StringToUUIDConverter
    UUID id = invoice.typeConverter.convertTo(UUID.class, invoice.getId());
  }

}

ここでは、Spring Boot はアプリケーションコンテキストで使用できる Spring の ConversionService インスタンスに変換を委譲します。ConversionService インスタンスがない場合は、Camel Spring Boot の自動設定が ConversionService のインスタンスを作成します。

6.11. タイプ変換機能の無効化

TypeConverter インスタンスや Spring ブリッジなど、Camel Spring Boot のタイプ変換機能の登録を無効にするには、以下のように camel.springboot.typeConversion プロパティーを false に設定します。

camel.springboot.typeConversion = false

6.12. XML ルートの追加

デフォルトでは、camel-spring-boot によって自動検出され、含まれる camel ディレクトリー下のクラスパスに Camel XML ルートを配置することができます。Camel バージョン 2.17 以降では、以下のように設定オプションを使用して、ディレクトリー名を設定したり、この機能を無効にすることができます。

// turn off
camel.springboot.xmlRoutes = false
// scan in the com/foo/routes classpath
camel.springboot.xmlRoutes = classpath:com/foo/routes/*.xml
注記

XML ファイルは、以下のような CamelContext ではなく Camel XML ルートである必要があります。

   <routes xmlns="http://camel.apache.org/schema/spring">
        <route id="test">
            <from uri="timer://trigger"/>
            <transform>
                <simple>ref:myBean</simple>
            </transform>
            <to uri="log:out"/>
        </route>
    </routes>

<camelContext> と Spring XML ファイルを使用する場合、Camel を Spring XML ファイルおよび application.properties ファイルで設定できます。たとえば、Camel に名前を設定し、ストリームキャッシュを有効にするには、以下を追加します。

camel.springboot.name = MyCamel
camel.springboot.stream-caching-enabled=true

6.13. XML RestーDSL の追加

デフォルトでは、camel-spring-boot によって自動検出され、含まれる camel-rest ディレクトリー下のクラスパスに Camel Rest-DSL XML ルートを配置することができます。以下のように設定オプションを使用して、ディレクトリー名を設定したり、この機能を無効にすることができます。

// turn off
camel.springboot.xmlRests = false
// scan in the com/foo/routes classpath
camel.springboot.xmlRests = classpath:com/foo/rests/*.xml
注記

Rest-DSL XML ファイルは、以下のように CamelContext ではなく Camel XML rest である必要があります。

   <rests xmlns="http://camel.apache.org/schema/spring">
      <rest>
         <post uri="/persons">
            <to uri="direct:postPersons"/>
         </post>
         <get uri="/persons">
            <to uri="direct:getPersons"/>
         </get>
         <get uri="/persons/{personId}">
             <to uri="direct:getPersionId"/>
         </get>
         <put uri="/persons/{personId}">
             <to uri="direct:putPersionId"/>
         </put>
         <delete uri="/persons/{personId}">
             <to uri="direct:deletePersionId"/>
         </delete>
      </rest>
    </rests>

6.14. Camel Spring Boot でのテスト

Spring Boot で実行している Camel の場合、Spring Boot は自動的に Camel と @Component アノテーションが付けられたそのルートを組み込みします。Spring Boot でテストする場合、@ContextConfiguration ではなく @SpringBootTest を使用して、使用する設定クラスを指定します。

異なる RouteBuilder クラスに複数の Camel ルートがある場合、Camel Spring Boot にはこれらのルートがすべて含まれます。1 つの RouteBuilder クラスのみからルートをテストする場合は、以下のパターンを使用して、有効にする RouteBuilder を include (含める) または exclude (除外) することができます。

  • java-routes-include-pattern: パターンに一致する RouteBuilder クラスを include (含める)ために使用されます。
  • java-routes-exclude-pattern: パターンに一致する RouteBuilder クラスを exclude (除外) するために使用されます。exclude は include よりも優先されます。

以下のように、@SpringBootTest アノテーションへのプロパティーとして、ユニットテストクラスでこれらのパターンを指定できます。

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = {MyApplication.class);
   properties = {"camel.springboot.java-routes-include-pattern=**/Foo*"})
public class FooTest {

FooTest クラスの include パターンは Ant スタイルパターンを表す **/Foo* です。このパターンは、すべてのパッケージ名と一致する 2 つのアスタリスクで始まります。/Foo* は、FooRoute のようにクラス名が Foo で始まる必要があることを意味します。以下の Maven コマンドを使用してテストを実行できます。

mvn test -Dtest=FooTest

6.15. その他の参考資料

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.