Kotlin DSL

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

集成流程作为 lambda 的定义,我们通常不需要 Kotlin 的其他信息,只需声明这样一个豆子:spring-doc.cadn.net.cn

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

在这种情况下,Kotlin 理解 lambda 应被翻译为集成流程匿名实例和目标Java DSL处理器会正确解析该结构到Java对象中。spring-doc.cadn.net.cn

作为上述构造的替代方案,并为与下面解释的用例保持一致,应使用Kotlin专用的DSL来声明构建模式风格中的集成流程:spring-doc.cadn.net.cn

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

如此全球化integrationFlow()函数期望构建者风格中 lambda 对KotlinIntegrationFlowDefinition(Kotlin的包装集成流程定义) 并产生一个正则集成流程lambda实现。 更多超载integrationFlow()以下为变体。spring-doc.cadn.net.cn

许多其他情景需要集成流程从数据源开始(例如:JdbcPollingChannel适配器,JmsInboundGateway或者只是一个现有的消息频道). 为此,Spring 集成 Java DSL 提供了集成流程流流 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 结构兼容。 为弥补这一空白,本项目提供了围绕集成流程流利API。 它被实现为一组超载integrationFlow()功能。 与消费者有关KotlinIntegrationFlowDefinition将剩余的流声明为集成流程lambda 以重复使用上述体验,同时避免get()最后打电话。 例如:spring-doc.cadn.net.cn

@Bean
fun functionFlow() =
        integrationFlow<Function<String, String>>({ beanName("functionGateway") }) {
            transform<String, String> { it.toUpperCase() }
        }

@Bean
fun messageSourceFlow() =
        integrationFlow(MessageProcessorMessageSource { "testSource" },
                { poller { it.fixedDelay(10).maxMessagesPerPoll(1) } }) {
            channel { queue("fromSupplierQueue") }
        }

此外,Kotlin 扩展也为 Java DSL API 提供了,该 API 需要对 Kotlin 结构进行一些优化。 例如IntegrationFlowDefinition<*>对于许多具有Class<P(ClassP>论点:spring-doc.cadn.net.cn

@Bean
fun convertFlow() =
    integrationFlow("convertFlowInput") {
        convert<TestPojo>()
    }
具体化型可以是整体留言<*>如果需要访问作符的 lambda 中的头部。