如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

Kotlin DSL

Kotlin DSL 是 Java DSL 的封装和扩展,旨在使基于 Kotlin 的 Spring Integration 开发尽可能顺畅和直观,同时与现有的 Java API 和 Kotlin 语言特定结构保持互操作性。spring-doc.cadn.net.cn

开始所需的一切只是导入 org.springframework.integration.dsl.integrationFlow —— 一个用于 Kotlin DSL 的重载全局函数。spring-doc.cadn.net.cn

对于 IntegrationFlow 个作为 Lambda 表达式的定义,我们通常不需要 Kotlin 提供其他功能,只需按如下方式声明一个 Bean:spring-doc.cadn.net.cn

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

在这种情况下,Kotlin 会理解该 lambda 表达式应转换为 IntegrationFlow 个匿名实例,而目标 Java DSL 处理器会将此结构正确解析为 Java 对象。spring-doc.cadn.net.cn

作为上述构造方式的替代方案,并与下文说明的用例保持一致,声明集成流程时应使用 Kotlin 特定的 DSL,采用 构建器(builder)模式风格:spring-doc.cadn.net.cn

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

这样一个全局 integrationFlow() 函数期望在构建器风格中为 KotlinIntegrationFlowDefinitionIntegrationFlowDefinition 的 Kotlin 包装器)提供一个 lambda,并生成一个常规的 IntegrationFlow lambda 实现。 有关更多重载的 integrationFlow() 变体,请参见下文。spring-doc.cadn.net.cn

许多其他场景需要从数据源(例如 IntegrationFlowJdbcPollingChannelAdapterJmsInboundGateway,或现有的 MessageChannel)启动。
为此,Spring Integration Java DSL 提供了一个 IntegrationFlow 流畅 API,并包含大量重载的 from() 方法。
此 API 也可在 Kotlin 中使用:spring-doc.cadn.net.cn

@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() 调用。 例如:spring-doc.cadn.net.cn

@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 扩展,该 API 需要针对 Kotlin 结构进行一些改进。 例如,IntegrationFlowDefinition<*> 需要对许多具有 Class<P> 个参数的方法进行重化(reifying):spring-doc.cadn.net.cn

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