Kotlin DSL

Kotlin DSL 是 Java DSL 的一个封装和扩展,旨在通过与现有 Java API 和 Kotlin 语言特定结构的互操作性,使 Kotlin 上的 Spring Integration 开发尽可能平滑和直接。

您只需导入 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() 函数需要一个构建器样式的 lambda 表达式,用于 KotlinIntegrationFlowDefinitionIntegrationFlowDefinition 的 Kotlin 封装),并生成一个常规的 IntegrationFlow lambda 实现。请参阅下面更多重载的 integrationFlow() 变体。

许多其他场景需要 IntegrationFlow 从数据源启动(例如 JdbcPollingChannelAdapterJmsInboundGateway 或只是一个现有的 MessageChannel)。为此,Spring Integration Java DSL 提供了一个具有大量重载 from() 方法的 IntegrationFlow 流式 API。此 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> 参数的方法进行具象化(reifying)

@Bean
fun convertFlow() =
    integrationFlow("convertFlowInput") {
        convert<TestPojo>()
    }
如果需要在运算符的 lambda 表达式中访问消息头,则具象化类型可以是整个 Message<*>
© . This site is unofficial and not affiliated with VMware.