Kotlin DSL
Kotlin DSL 是 Java DSL 的一个包装和扩展,旨在通过与现有 Java API 和 Kotlin 语言特定结构的互操作性,使 Spring Integration 在 Kotlin 上的开发尽可能顺畅和直接。
你所需要做的就是导入 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()
函数期望一个 KotlinIntegrationFlowDefinition
(IntegrationFlowDefinition
的 Kotlin 包装器)的构建器样式 lambda,并生成一个常规的 IntegrationFlow
lambda 实现。
请参阅下面更多重载的 integrationFlow()
变体。
许多其他场景要求 IntegrationFlow
从数据源(例如 JdbcPollingChannelAdapter
、JmsInboundGateway
或只是一个现有的 MessageChannel
)开始。
为此,Spring Integration Java DSL 提供了一个 IntegrationFlow
流式 API,其中包含大量重载的 from()
方法。
这个 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>
参数的方法进行具体化:
@Bean
fun convertFlow() =
integrationFlow("convertFlowInput") {
convert<TestPojo>()
}
如果需要在操作符的 lambda 中访问头部,具体化类型可以是整个 |