メッセージフローの操作

IntegrationFlowBuilder は、メッセージフローに接続された統合コンポーネントを生成するためのトップレベル API を提供します。単一のフローで統合を達成できる場合(多くの場合)、これは便利です。または、MessageChannel インスタンスを介して IntegrationFlow インスタンスを結合できます。

デフォルトでは、MessageFlow は Spring Integration の用語では「チェーン」として動作します。つまり、エンドポイントは、DirectChannel インスタンスによって自動的かつ暗黙的に接続されます。メッセージフローは実際にはチェーンとして構築されておらず、はるかに柔軟性があります。例: inputChannel 名がわかっている場合(つまり、明示的に定義している場合)、フロー内の任意のコンポーネントにメッセージを送信できます。フロー内で外部定義されたチャネルを参照して、直接チャネルの代わりにチャネルアダプターの使用を許可することもできます(リモートトランスポートプロトコル、ファイル I/O などを有効にするため)。そのため、DSL は Spring Integration chain 要素をサポートしません。この場合、多くの価値を追加しないからです。

Spring Integration Java DSL は、他の構成オプションと同じ Bean 定義モデルを生成し、既存の Spring Framework @Configuration インフラストラクチャに基づいているため、XML 定義と併用し、Spring Integration メッセージングアノテーション構成と接続できます。

ラムダを使用して、直接 IntegrationFlow インスタンスを定義することもできます。次の例は、その方法を示しています。

@Bean
public IntegrationFlow lambdaFlow() {
    return f -> f.filter("World"::equals)
                   .transform("Hello "::concat)
                   .handle(System.out::println);
}

この定義の結果は、暗黙的な直接チャネルで接続された統合コンポーネントの同じセットです。ここでの唯一の制限は、このフローが名前付き直接チャネル - lambdaFlow.input で開始されることです。また、Lambda フローは MessageSource または MessageProducer から開始できません。

バージョン 5.1 以降、この種類の IntegrationFlow はプロキシにラップされ、ライフサイクル制御を公開し、内部で関連付けられた StandardIntegrationFlow の inputChannel へのアクセスを提供します。

バージョン 5.0.6 以降、IntegrationFlow のコンポーネントに対して生成された Bean 名には、フロー Bean の後に接頭辞としてドット(.)が続きます。例: 前のサンプルの .transform("Hello "::concat) の ConsumerEndpointFactoryBean は、Bean 名が lambdaFlow.o.s.i.config.ConsumerEndpointFactoryBean#0 になります。(o.s.i は、ページに収まるように org.springframework.integration から短縮されています)そのエンドポイントの Transformer 実装 Bean は、lambdaFlow.transformer#0 (バージョン 5.1 で始まる)の Bean 名を持ち、MethodInvokingTransformer クラスの完全修飾名の代わりに、そのコンポーネント型使用されています。Bean 名をフロー内で生成する必要がある場合、すべての NamedComponent に同じパターンが適用されます。これらの生成された Bean 名には、ログの解析や分析ツールでのコンポーネントのグループ化などの目的で、また実行時に統合フローを同時に登録する際の競合状態を回避するために、フロー ID が付加されます。詳細については、動的およびランタイム統合フローを参照してください。