使用訊息流

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 被包裝成代理,以暴露生命週期控制並提供對內部關聯的 StandardIntegrationFlowinputChannel 的訪問。

從 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 為字首,用於解析日誌或在某些分析工具中將元件分組,以及避免我們執行時併發註冊整合流時的競爭條件。有關更多資訊,請參閱 動態和執行時整合流

© . This site is unofficial and not affiliated with VMware.