Apache Camel サポート

Spring Integration は、同じアプリケーションコンテキストで宣言された Apache Camel (英語) エンドポイントと通信するための API と構成を提供します。

この依存関係をプロジェクトに含める必要があります。

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-camel</artifactId>
    <version>6.3.1</version>
</dependency>
compile "org.springframework.integration:spring-integration-camel:6.3.1"

Spring Integration と Apache Camel はエンタープライズ統合パターンを実装し、構成する便利な方法を提供しますが、プロジェクトは API と抽象化の実装に異なるアプローチを使用します。Spring Integration は、Spring コアの依存性注入コンテナーに完全に依存しています。チャネルアダプターの実装には、他の多くの Spring プロジェクト (Spring Data、Spring AMQP、Spring for Apache Kafka など) を使用します。また、開発者が統合フローを作成するときに認識する必要がある 第一級オブジェクト として MessageChannel 抽象化も使用されます。一方、Apache Camel はメッセージチャネルの 第一級オブジェクト 抽象化を提供せず、API から隠蔽された内部交換を介してルートを構成することを提案しています。さらに、Spring アプリケーションで使用するには、いくつかの追加の依存関係と構成 [Apache] (英語) が必要です。

最終的なエンタープライズ統合ソリューションでは、その各部がどのように実装されるかは重要ではありませんが、開発者のエクスペリエンスと高い生産性は考慮されます。開発者はさまざまな理由で 1 つのフレームワークを別のフレームワークよりも選択するか、ターゲットシステムのサポートにギャップがある場合はその両方を選択する可能性があります。Spring Integration および Apache Camel アプリケーションは、チャネルアダプターを実装する多くの外部プロトコルを介して相互に対話できます。たとえば、Spring Integration フローは、コンシューマー側の Apache Camel エンドポイントによって消費される Apache Kafka トピックにレコードを発行する場合があります。または、Apache Camel ルートは、ディレクトリの SFTP ファイルにデータを書き込む場合があります。これは、Spring Integration からの SFTP 受信チャネルアダプターによってポーリングされます。または、同じ Spring アプリケーションコンテキスト内で、ApplicationEvent  抽象化 [Apache] (英語) を介して通信できます。

開発プロセスを容易にし、不必要なネットワークホップを回避するために、Apache Camel はメッセージチャネル経由で Spring Integration と通信するモジュール [Apache] (英語) を提供します。メッセージを送信または消費するために必要なのは、アプリケーションコンテキストからの MessageChannel への参照だけです。これは、Apache Camel ルートがメッセージフローのイニシエーターであり、Spring Integration がソリューションの一部としてサポートのロールのみを果たしている場合にうまく機能します。

同様の開発者エクスペリエンスを実現するために、Spring Integration は Apache Camel エンドポイントを呼び出し、オプションで応答を待つためのチャネルアダプターを提供するようになりました。Spring Integration API と抽象化の観点からは、Apache Camel メッセージを消費するために MessageChannel をサブスクライブするだけで十分であるため、受信チャネルアダプターはありません。

Apache Camel 用送信 チャネルアダプター

CamelMessageHandler は AbstractReplyProducingMessageHandler 実装であり、一方向 (デフォルト) モードとリクエスト / 応答モードの両方で動作します。org.apache.camel.ProducerTemplate を使用して org.apache.camel.Endpoint に送信 (または送受信) します。対話モードは、ExchangePattern オプションによって制御できます (このオプションは、SpEL 式を介してリクエストメッセージに対して実行時に評価できます)。ターゲット Apache Camel エンドポイントは、明示的に構成することも、実行時に評価される SpEL 式として構成することもできます。それ以外の場合は、ProducerTemplate で提供される defaultEndpoint に戻ります。エンドポイントを指定する代わりに、インラインの明示的な LambdaRouteBuilder を提供して、たとえば、Spring Integration でチャネルアダプターがサポートされていない Apache Camel コンポーネントを呼び出すことができます。

さらに、HeaderMapper<org.apache.camel.Message> (CamelHeaderMapper がデフォルト実装) を提供して、Spring Integration メッセージと Apache Camel メッセージ間でどのヘッダーをマップするかを決定できます。デフォルトでは、すべてのヘッダーがマップされます。

CamelMessageHandler は、ProducerTemplate.asyncSend() を呼び出し、応答処理 (存在する場合) のために CompletableFuture を生成する async モードをサポートします。

exchangeProperties は、Map に評価される必要がある SpEL 式を介してカスタマイズできます。

ProducerTemplate が指定されていない場合は、アプリケーションコンテキストから解決された CamelContext Bean を介して作成されます。

@Bean
@ServiceActivator(inputChannel = "sendToCamel")
CamelMessageHandler camelService(ProducerTemplate producerTemplate) {
    CamelHeaderMapper headerMapper = new CamelHeaderMapper();
    headerMapper.setOutboundHeaderNames("");
    headerMapper.setInboundHeaderNames("testHeader");

    CamelMessageHandler camelMessageHandler = new CamelMessageHandler(producerTemplate);
    camelMessageHandler.setEndpointUri("direct:simple");
    camelMessageHandler.setExchangePatternExpression(spelExpressionParser.parseExpression("headers.exchangePattern"));
    camelMessageHandler.setHeaderMapper(headerMapper);
    return camelMessageHandler;
}

Java DSL フロー定義の場合、このチャネルアダプターは、Camel ファクトリによって提供されるいくつかのバリアントで構成できます。

@Bean
IntegrationFlow camelFlow() {
    return f -> f
            .handle(Camel.gateway().endpointUri("direct:simple"))
            .handle(Camel.route(this::camelRoute))
            .handle(Camel.handler().endpointUri("log:com.mycompany.order?level=WARN"));
}

private void camelRoute(RouteBuilder routeBuilder) {
    routeBuilder.from("direct:inbound").transform(routeBuilder.simple("${body.toUpperCase()}"));
}