该框架也得到了改进,以支持函数的 Kotlin lambda,因此现在您可以结合使用 Kotlin 语言和 Spring 集成流定义:spring-doc.cn

@Bean
@Transformer(inputChannel = "functionServiceChannel")
fun kotlinFunction(): (String) -> String {
    return { it.toUpperCase() }
}

@Bean
@ServiceActivator(inputChannel = "messageConsumerServiceChannel")
fun kotlinConsumer(): (Message<Any>) -> Unit {
    return { print(it) }
}

@Bean
@InboundChannelAdapter(value = "counterChannel",
        poller = Poller(fixedRate = "10", maxMessagesPerPoll = "1"))
fun kotlinSupplier(): () -> String {
    return { "baz" }
}

Kotlin 协程

从版本 6.0 开始, Spring 集成提供了对 Kotlin 协程的支持。 现在函数和&返回类型可以用于服务方法:suspendkotlinx.coroutines.Deferredkotlinx.coroutines.flow.Flowspring-doc.cn

@ServiceActivator(inputChannel = "suspendServiceChannel", outputChannel = "resultChannel")
suspend fun suspendServiceFunction(payload: String) = payload.uppercase()

@ServiceActivator(inputChannel = "flowServiceChannel", outputChannel = "resultChannel", async = "true")
fun flowServiceFunction(payload: String) =
    flow {
        for (i in 1..3) {
            emit("$payload #$i")
        }
    }

该框架将它们视为 Reactive Streams 交互,并用于转换为相应的 Reactor 类型。 这样的函数 reply 将在 reply 通道中处理,如果它是 ,或者作为相应回调的结果。ReactiveAdapterRegistryMonoFluxReactiveStreamsSubscribableChannelCompletableFuturespring-doc.cn

默认情况下,具有 result 的函数不在 上,因此实例将作为回复消息有效负载生成。 目标应用程序负责将此对象作为协程处理或分别将其转换为 。Flowasync@ServiceActivatorFlowFlux

在 Kotlin 中声明接口方法时,也可以使用修饰符进行标记。 框架利用 internally 使用下游流执行请求-回复。 这样的结果由 API 在内部处理,以实现网关的调用函数的参数:@MessagingGatewaysuspendMonoMonoMonoKt.awaitSingleOrNull()kotlin.coroutines.Continuationsuspendspring-doc.cn

@MessagingGateway(defaultRequestChannel = "suspendRequestChannel")
interface SuspendFunGateway {

    suspend fun suspendGateway(payload: String): String

}

根据 Kotlin 语言要求,必须将此方法作为协程调用:spring-doc.cn

@Autowired
private lateinit var suspendFunGateway: SuspendFunGateway

fun someServiceMethod() {
    runBlocking {
        val reply = suspendFunGateway.suspendGateway("test suspend gateway")
    }
}
默认情况下,具有 result 的函数不在 上,因此实例将作为回复消息有效负载生成。 目标应用程序负责将此对象作为协程处理或分别将其转换为 。Flowasync@ServiceActivatorFlowFlux