メッセージフローの操作
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 が付加されます。詳細については、動的およびランタイム統合フローを参照してください。