跳到主要内容

Kotlin DSL

QWen Plus 中英对照 Kotlin DSL

Kotlin DSL 是 Java DSL 的包装和扩展,旨在使用 Kotlin 进行 Spring Integration 开发尽可能顺畅和直接,并与现有的 Java API 和 Kotlin 语言特定结构保持互操作性。

你只需要导入 org.springframework.integration.dsl.integrationFlow 即可开始 —— 这是 Kotlin DSL 的一个重载全局函数。

对于作为 lambda 的 IntegrationFlow 定义,我们通常不需要 Kotlin 的其他任何东西,只需像这样声明一个 bean:

@Bean
fun oddFlow() =
IntegrationFlow { flow ->
flow.handle<Any> { _, _ -> "odd" }
}
kotlin

在这种情况下,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() }
}
kotlin

这样的全局 integrationFlow() 函数期望以构建器风格的 lambda 作为 KotlinIntegrationFlowDefinitionIntegrationFlowDefinition 的 Kotlin 包装)的参数,并生成一个常规的 IntegrationFlow lambda 实现。请参阅下面更多的重载 integrationFlow() 变体。

许多其他场景需要从数据源启动一个 IntegrationFlow(例如 JdbcPollingChannelAdapterJmsInboundGateway 或只是一个现有的 MessageChannel)。为此,Spring Integration Java DSL 提供了一个具有大量重载 from() 方法的 IntegrationFlow 流式 API。此 API 也可以在 Kotlin 中使用:

// 示例代码保持不变,因为这是编程语言特定的语法
kotlin
@Bean
fun flowFromSupplier() =
IntegrationFlow.fromSupplier({ "bar" }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
.channel { c -> c.queue("fromSupplierQueue") }
.get()
kotlin

但遗憾的是,并不是所有的 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") }
}
kotlin

此外,为 Java DSL API 提供了 Kotlin 扩展,这些扩展需要针对 Kotlin 结构进行一些改进。例如,IntegrationFlowDefinition<*> 需要在许多带有 Class<P> 参数的方法中进行实化:

@Bean
fun convertFlow() =
integrationFlow("convertFlowInput") {
convert<TestPojo>()
}
kotlin
备注

具体化类型可以是完整的 Message<*>,如果在操作符的 lambda 中需要访问头部信息的话。