統合フローの構成

Spring Integration の第一級オブジェクトとしての MessageChannel 抽象化では、統合フローの構成が常に想定されていました。フロー内の任意のエンドポイントの入力チャネルを使用して、このチャネルを出力として持つエンドポイントからだけでなく、他の任意のエンドポイントからメッセージを送信できます。さらに、@MessagingGateway 契約、Content Enricher コンポーネント、<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 定義に自動接続するだけで十分です。