使用訊息流
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 流程無法從 MessageSource
或 MessageProducer
開始。
從 5.1 版開始,這種 IntegrationFlow
會包裝到 Proxy,以公開生命週期控制,並提供對內部關聯的 StandardIntegrationFlow
的 inputChannel
的存取權。
從 5.0.6 版開始,IntegrationFlow
中元件產生的 Bean 名稱會包含流程 Bean,後跟一個點 (.
) 作為前綴。例如,前面範例中 .transform("Hello "::concat)
的 ConsumerEndpointFactoryBean
會產生名為 lambdaFlow.o.s.i.config.ConsumerEndpointFactoryBean#0
的 Bean 名稱。(o.s.i
是 org.springframework.integration
的縮寫,為了符合頁面寬度。)該端點的 Transformer
實作 Bean 的 Bean 名稱為 lambdaFlow.transformer#0
(從 5.1 版開始),其中使用其元件類型,而不是 MethodInvokingTransformer
類別的完整限定名稱。當 Bean 名稱必須在流程中產生時,相同的模式會應用於所有 NamedComponent
。這些產生的 Bean 名稱會加上流程 ID 作為前綴,用於解析日誌或將元件分組到某些分析工具中等目的,以及避免在我們同時在執行階段註冊整合流程時發生競爭情況。有關更多資訊,請參閱 動態與執行階段整合流程。