Kotlin DSL
Kotlin DSL 是 Java DSL 的一個封裝和擴充套件,旨在透過與現有 Java API 和 Kotlin 語言特定結構的互操作性,使 Kotlin 上的 Spring Integration 開發儘可能平滑和直接。
您只需匯入 org.springframework.integration.dsl.integrationFlow - 一個用於 Kotlin DSL 的過載全域性函式 - 即可開始使用。
對於作為 lambda 表示式的 IntegrationFlow 定義,我們通常不需要 Kotlin 的其他任何東西,只需像這樣宣告一個 bean
@Bean
fun oddFlow() =
IntegrationFlow { flow ->
flow.handle<Any> { _, _ -> "odd" }
}
在這種情況下,Kotlin 理解 lambda 應該被轉換為 IntegrationFlow 匿名例項,目標 Java DSL 處理器會正確地將此結構解析為 Java 物件。
作為上述構造的替代方案,併為了與下面解釋的用例保持一致,應使用 Kotlin 特定的 DSL 以構建器模式樣式宣告整合流
@Bean
fun flowLambda() =
integrationFlow {
filter<String> { it === "test" }
wireTap {
handle { println(it.payload) }
}
transform<String> { it.toUpperCase() }
}
這樣一個全域性的 integrationFlow() 函式需要一個構建器樣式的 lambda 表示式,用於 KotlinIntegrationFlowDefinition(IntegrationFlowDefinition 的 Kotlin 封裝),並生成一個常規的 IntegrationFlow lambda 實現。請參閱下面更多過載的 integrationFlow() 變體。
許多其他場景需要 IntegrationFlow 從資料來源啟動(例如 JdbcPollingChannelAdapter、JmsInboundGateway 或只是一個現有的 MessageChannel)。為此,Spring Integration Java DSL 提供了一個具有大量過載 from() 方法的 IntegrationFlow 流式 API。此 API 也可以在 Kotlin 中使用
@Bean
fun flowFromSupplier() =
IntegrationFlow.fromSupplier({ "bar" }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
.channel { c -> c.queue("fromSupplierQueue") }
.get()
但不幸的是,並非所有的 from() 方法都與 Kotlin 結構相容。為了彌補這一差距,該專案圍繞 IntegrationFlow 流式 API 提供了一個 Kotlin DSL。它作為一組過載的 integrationFlow() 函式實現。透過 KotlinIntegrationFlowDefinition 的消費者來將流的其餘部分宣告為 IntegrationFlow lambda,以重用上述經驗,並避免最終的 get() 呼叫。例如
@Bean
fun functionFlow() =
integrationFlow<Function<String, String>>({ beanName("functionGateway") }) {
transform<String> { it.toUpperCase() }
}
@Bean
fun messageSourceFlow() =
integrationFlow(MessageProcessorMessageSource { "testSource" },
{ poller { it.fixedDelay(10).maxMessagesPerPoll(1) } }) {
channel { queue("fromSupplierQueue") }
}
此外,還為 Java DSL API 提供了 Kotlin 擴充套件,這需要對 Kotlin 結構進行一些最佳化。例如,IntegrationFlowDefinition<*> 需要對許多帶有 Class<P> 引數的方法進行具象化(reifying)
@Bean
fun convertFlow() =
integrationFlow("convertFlowInput") {
convert<TestPojo>()
}
如果需要在運算子的 lambda 表示式中訪問訊息頭,則具象化型別可以是整個 Message<*>。 |