DSL 基礎
org.springframework.integration.dsl
包包含前面提到的 IntegrationFlowBuilder
API 和許多 IntegrationComponentSpec
實現。這些實現也是構建器,提供了流暢的 API 來配置具體的端點。IntegrationFlowBuilder
基礎設施為基於訊息的應用程式提供了常見的企業整合模式 (EIP),例如通道、端點、輪詢器和通道攔截器。
- 重要
-
IntegrationComponentSpec
是一個FactoryBean
實現,因此其getObject()
方法不得從 bean 定義中呼叫。IntegrationComponentSpec
實現必須保持原樣用於 bean 定義,框架將管理其生命週期。對於IntegrationFlow
bean 定義,必須使用目標IntegrationComponentSpec
型別(一個FactoryBean
值)的 bean 方法引數注入,而不是使用 bean 方法引用。
在 DSL 中,端點被表達為動詞以提高可讀性。以下列表包含常見的 DSL 方法名稱和關聯的 EIP 端點
-
transform →
Transformer
(轉換) -
filter →
Filter
(過濾) -
handle →
ServiceActivator
(處理) -
split →
Splitter
(分割) -
aggregate →
Aggregator
(聚合) -
route →
Router
(路由) -
bridge →
Bridge
(橋接)
從概念上講,整合過程是透過將這些端點組合成一個或多個訊息流來構建的。請注意,EIP 並未正式定義“訊息流”這個術語,但將其視為使用眾所周知的訊息傳遞模式的工作單元很有用。DSL 提供了一個 IntegrationFlow
元件來定義通道及其之間的端點組合,但現在 IntegrationFlow
僅起配置作用,用於在應用程式上下文中填充真正的 bean,並且不在執行時使用。然而,可以將 IntegrationFlow
的 bean 自動裝配為 Lifecycle
以控制整個流的 start()
和 stop()
,這會委託給與此 IntegrationFlow
相關聯的所有 Spring Integration 元件。以下示例使用 IntegrationFlow
流暢 API,透過 IntegrationFlowBuilder
中的 EIP 方法來定義一個 IntegrationFlow
bean
@Bean
public IntegrationFlow integerFlow() {
return IntegrationFlow.from("input")
.<String, Integer>transform(Integer::parseInt)
.get();
}
transform
方法接受一個 lambda 作為端點引數來操作訊息載荷。該方法的實際引數是一個 GenericTransformer<S, T>
例項。因此,這裡可以使用任何提供的轉換器(ObjectToJsonTransformer
、FileToStringTransformer
等)。
在底層,IntegrationFlowBuilder
會識別 MessageHandler
和相應的端點,分別使用 MessageTransformingHandler
和 ConsumerEndpointFactoryBean
。考慮另一個示例
@Bean
public IntegrationFlow myFlow() {
return IntegrationFlow.from("input")
.filter("World"::equals)
.transform("Hello "::concat)
.handle(System.out::println)
.get();
}
前面的示例組合了一個 Filter → Transformer → Service Activator
的序列。該流是“單向的”。也就是說,它不提供回覆訊息,只將載荷列印到 STDOUT。端點透過直接通道自動連線。
Lambda 和
Message<?> 引數在使用 EIP 方法中的 lambda 時,“輸入”引數通常是訊息載荷。如果你希望訪問整個訊息,請使用接受
這將在執行時因 相反,請使用
|
Bean 定義覆蓋
Java DSL 可以為流定義中內聯定義的物件註冊 bean,也可以重用現有的、注入的 bean。如果內聯物件和現有 bean 定義定義了相同的 bean 名稱,則會丟擲 |