使用訊息流

IntegrationFlowBuilder 提供了一個頂級 API,用於生成連線到訊息流的整合元件。當你的整合可以透過單個流完成時(通常如此),這會很方便。或者,IntegrationFlow 例項可以透過 MessageChannel 例項連線。

預設情況下,MessageFlow 在 Spring 整合術語中表現為“鏈” (chain)。也就是說,端點由 DirectChannel 例項自動隱式連線。訊息流實際上並非構造為鏈,這提供了更大的靈活性。例如,如果你知道其 inputChannel 名稱(即,如果你明確定義了它),你可以向流中的任何元件傳送訊息。你還可以在流中引用外部定義的通道,以允許使用通道介面卡(例如,啟用遠端傳輸協議、檔案 I/O 等),而不是直接通道。因此,DSL 不支援 Spring 整合 chain 元素,因為它在此情況下並沒有增加太多價值。

由於 Spring 整合 Java DSL 生成的 bean 定義模型與任何其他配置選項相同,並且基於現有的 Spring Framework @Configuration 基礎設施,因此可以與 XML 定義一起使用,並與 Spring 整合訊息處理註解配置結合。

你也可以使用 lambda 定義直接的 IntegrationFlow 例項。以下示例展示瞭如何實現

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

此定義的결果是與隱式 direct channel 連線的同一組整合元件。唯一的限制是此流以一個命名 direct channel - lambdaFlow.input 啟動。此外,Lambda 流不能從 MessageSourceMessageProducer 開始。

從 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.iorg.springframework.integration 的縮寫,以便適應頁面顯示。)該端點的 Transformer 實現 bean 的 bean 名稱為 lambdaFlow.transformer#0(從 5.1 版本開始),其中使用了其元件型別,而不是 MethodInvokingTransformer 類的完全限定名。當需要在流中生成 bean 名稱時,所有 NamedComponent 都應用相同的模式。這些生成的 bean 名稱以流 ID 為字首,用於解析日誌或在某些分析工具中將元件分組,以及避免在執行時併發註冊整合流時出現競爭條件。有關更多資訊,請參閱動態與執行時整合流