最新の安定バージョンについては、Spring Integration 7.1.0 を使用してください!

統合フローの構成

Spring Integration における第一級オブジェクトとしての MessageChannel 抽象化では、統合フローのコンポジションが常に前提とされていました。フロー内の任意のエンドポイントの入力チャネルは、このチャネルを出力として持つエンドポイントだけでなく、他の任意のエンドポイントからのメッセージの送信にも使用できます。さらに、@MessagingGateway 契約、コンテンツエンリッチャーコンポーネント、<chain> などの複合エンドポイント、IntegrationFlow Bean(例: IntegrationFlowAdapter)を使用することで、ビジネスロジックをより短く再利用可能なパーツに分散させることが容易になります。最終的なコンポジションに必要なのは、送受信先の MessageChannel に関する知識だけです。

バージョン 5.5.4 以降、MessageChannel からさらに抽象化し、実装の詳細をエンドユーザーから隠すために、IntegrationFlow は from(IntegrationFlow) ファクトリメソッドを導入して、既存のフローの出力から現在の IntegrationFlow を開始できるようにします。

@Bean
IntegrationFlow templateSourceFlow() {
    return IntegrationFlow.fromSupplier(() -> "test data")
            .channel("sourceChannel")
            .get();
}

@Bean
IntegrationFlow compositionMainFlow(IntegrationFlow templateSourceFlow) {
    return IntegrationFlow.from(templateSourceFlow)
            .<String, String>transform(String::toUpperCase)
            .channel(c -> c.queue("compositionMainFlowResult"))
            .get();
}

一方、IntegrationFlowDefinition には、他のフローの入力チャネルでカレントフローを継続するための to(IntegrationFlow) ターミナルオペレーターが追加されています。

@Bean
IntegrationFlow mainFlow(IntegrationFlow otherFlow) {
    return f -> f
            .<String, String>transform(String::toUpperCase)
            .to(otherFlow);
}

@Bean
IntegrationFlow otherFlow() {
    return f -> f
            .<String, String>transform(p -> p + " from other flow")
            .channel(c -> c.queue("otherFlowResultChannel"));
}

フローの途中の構成は、既存の gateway(IntegrationFlow) EIP 方式で簡単に実現できます。このようにして、よりシンプルで再利用可能な論理ブロックからフローを構成することで、あらゆる複雑なフローを構築できます。例: IntegrationFlow Bean のライブラリを依存関係として追加できます。構成クラスを最終プロジェクトにインポートし、IntegrationFlow 定義に自動接続するだけで十分です。