最新の安定バージョンについては、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 定義に自動接続するだけで十分です。