使用訊息流

IntegrationFlowBuilder 提供頂層 API,以產生連接至訊息流的整合元件。當您的整合可以使用單一流程完成(通常情況下是如此),這非常方便。或者,IntegrationFlow 實例可以透過 MessageChannel 實例連接。

預設情況下,MessageFlow 在 Spring Integration 術語中表現為「鏈」。也就是說,端點會由 DirectChannel 實例自動且隱含地連接。訊息流實際上並非建構成鏈,這樣可以提供更大的彈性。例如,如果您知道流程中任何元件的 inputChannel 名稱(也就是說,如果您明確定義它),您可以將訊息傳送到該元件。您也可以在流程中參考外部定義的通道,以允許使用通道配接器(以啟用遠端傳輸協定、檔案 I/O 等),而不是直接通道。因此,DSL 不支援 Spring Integration chain 元素,因為在這種情況下它沒有增加太多價值。

由於 Spring Integration Java DSL 產生的 Bean 定義模型與任何其他設定選項相同,並且基於現有的 Spring Framework @Configuration 基礎架構,因此它可以與 XML 定義一起使用,並與 Spring Integration 訊息傳遞註解設定連接。

您也可以使用 Lambda 定義直接 IntegrationFlow 實例。以下範例示範如何執行此操作

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

此定義的結果是相同的一組整合元件,它們透過隱含的直接通道連接。這裡唯一的限制是,此流程是從具名的直接通道 lambdaFlow.input 開始的。此外,Lambda 流程無法從 MessageSourceMessageProducer 開始。

從 5.1 版開始,這種 IntegrationFlow 會包裝到 Proxy,以公開生命週期控制,並提供對內部關聯的 StandardIntegrationFlowinputChannel 的存取權。

從 5.0.6 版開始,IntegrationFlow 中元件產生的 Bean 名稱會包含流程 Bean,後跟一個點 (.) 作為前綴。例如,前面範例中 .transform("Hello "::concat)ConsumerEndpointFactoryBean 會產生名為 lambdaFlow.o.s.i.config.ConsumerEndpointFactoryBean#0 的 Bean 名稱。(o.s.iorg.springframework.integration 的縮寫,為了符合頁面寬度。)該端點的 Transformer 實作 Bean 的 Bean 名稱為 lambdaFlow.transformer#0(從 5.1 版開始),其中使用其元件類型,而不是 MethodInvokingTransformer 類別的完整限定名稱。當 Bean 名稱必須在流程中產生時,相同的模式會應用於所有 NamedComponent。這些產生的 Bean 名稱會加上流程 ID 作為前綴,用於解析日誌或將元件分組到某些分析工具中等目的,以及避免在我們同時在執行階段註冊整合流程時發生競爭情況。有關更多資訊,請參閱 動態與執行階段整合流程