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 中访问头部,具体化类型可以是整个 |