科特林 DSL

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

您需要开始的只是导入org.springframework.integration.dsl.integrationFlow- Kotlin DSL 的重载全局函数。

对于IntegrationFlowlambdas 的定义,我们通常不需要 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, String> { it.toUpperCase() }
    }

这样的全局integrationFlow()函数需要一个 builder 样式的 lambda KotlinIntegrationFlowDefinition(用于 的 Kotlin 包装器IntegrationFlowDefinition)并生成一个常规的IntegrationFlowlambda 实现。请参阅下面的更多重载integrationFlow()变体。

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

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

但不幸的是,并非所有from()方法都与 Kotlin 结构兼容。IntegrationFlows为了解决这个问题,这个项目在工厂周围提供了一个 Kotlin DSL 。它被实现为一组重载integrationFlow()函数。使用消费者KotlinIntegrationFlowDefinition将流程的其余部分声明为IntegrationFlowlambda,以重用上述经验并避免get()最终调用。例如:

@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") }
        }

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

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

1. see XML Configuration