第6章 Spring Boot の Apache Camel
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