Kotlin DSL 是 Java DSL 的包装器和扩展,旨在通过与现有 Java API 和 Kotlin 语言特定结构的互操作性,使 Kotlin 上的 Spring Integration 开发尽可能顺利和直接。Spring中文文档

您只需要导入 - Kotlin DSL 的重载全局函数即可开始。org.springframework.integration.dsl.integrationFlowSpring中文文档

对于 lambda 的定义,我们通常不需要 Kotlin 的任何其他内容,只需声明一个 bean,如下所示:IntegrationFlowSpring中文文档

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

在这种情况下,Kotlin 理解 lambda 应该转换为匿名实例,目标 Java DSL 处理器将此构造正确地解析为 Java 对象。IntegrationFlowSpring中文文档

作为上述结构的替代方案,并且为了与下面解释的用例保持一致,应使用特定于 Kotlin 的 DSL 来声明构建器模式样式中的集成流:Spring中文文档

@Bean
fun flowLambda() =
    integrationFlow {
        filter<String> { it === "test" }
        wireTap {
                    handle { println(it.payload) }
                }
        transform<String> { it.toUpperCase() }
    }

这样的全局函数需要构建器样式的 lambda(为 的 Kotlin 包装器),并生成常规的 lambda 实现。 请参阅下面的更多重载变体。integrationFlow()KotlinIntegrationFlowDefinitionIntegrationFlowDefinitionIntegrationFlowintegrationFlow()Spring中文文档

许多其他方案需要从数据源(例如,或仅从现有数据源)启动。 为此,Spring Integration Java DSL 提供了一个流畅的 API,其中包含大量重载方法。 此 API 也可以在 Kotlin 中使用:IntegrationFlowJdbcPollingChannelAdapterJmsInboundGatewayMessageChannelIntegrationFlowfrom()Spring中文文档

@Bean
fun flowFromSupplier() =
         IntegrationFlow.fromSupplier({ "bar" }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
                 .channel { c -> c.queue("fromSupplierQueue") }
                 .get()

但不幸的是,并非所有方法都与 Kotlin 结构兼容。 为了弥补这一差距,该项目围绕流畅的 API 提供了一个 Kotlin DSL。 它被实现为一组重载函数。 使用者论坛将流的其余部分声明为 lambda,以重用上述体验,并最终避免调用。 例如:from()IntegrationFlowintegrationFlow()KotlinIntegrationFlowDefinitionIntegrationFlowget()Spring中文文档

@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>Spring中文文档

@Bean
fun convertFlow() =
    integrationFlow("convertFlowInput") {
        convert<TestPojo>()
    }
如果还需要访问运算符的 lambda 中的标头,则 reified 类型可以是一个整体。Message<*>
如果还需要访问运算符的 lambda 中的标头,则 reified 类型可以是一个整体。Message<*>