|
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.4.0! |
Kotlin DSL
Kotlin DSL 是 Java DSL 的包装器和扩展,旨在通过与现有 Java API 和 Kotlin 语言特定结构的互作性,使 Kotlin 上的 Spring 集成开发尽可能流畅和直接。
您只需导入org.springframework.integration.dsl.integrationFlow- Kotlin DSL 的重载全局函数。
为IntegrationFlow定义作为 lambda,我们通常不需要 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()函数需要一个生成器样式的 LambdaKotlinIntegrationFlowDefinition(用于IntegrationFlowDefinition) 并生成一个常规的IntegrationFlowLambda 实现。
查看更多超载integrationFlow()变体。
许多其他场景都需要IntegrationFlow从数据源开始(例如JdbcPollingChannelAdapter,JmsInboundGateway或者只是一个现有的MessageChannel).
为此,Spring 集成 Java DSL 提供了一个IntegrationFlowFluent API 及其大量重载from()方法。
此 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 结构兼容。
为了弥补这一差距,该项目提供了一个围绕IntegrationFlowFluent API 的 API 创建。
它被实现为一组重载的integrationFlow()功能。
使用使用者进行KotlinIntegrationFlowDefinition将流的其余部分声明为IntegrationFlowLambda 来重用上述体验,并避免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 扩展,该 API 需要对 Kotlin 结构进行一些改进。
例如IntegrationFlowDefinition<*>需要对许多方法进行 reifying,其中Class<P>论点:
@Bean
fun convertFlow() =
integrationFlow("convertFlowInput") {
convert<TestPojo>()
}
具体化类型可以是一个整体Message<*>如果还需要访问 Headers 以及 Operator 的 lambda。 |