与Spring Kafka侦听器一起使用Kotlin协程

与Spring Kafka侦听器一起使用Kotlin协程,kotlin,spring-kafka,kotlin-coroutines,Kotlin,Spring Kafka,Kotlin Coroutines,我正在尝试混合SpringKafka(2.5.6.RELEASE)的监听器和Kotlin的协同程序。具体来说,我有一个暂停乐趣: suspend fun updatePrice(command: StockPriceUpdateCommand): Boolean 然后,我有一个Spring Kafka侦听器,它必须在每次从分区读取新消息时调用该函数: @KafkaListener( id = "priceListener", topics = [ "

我正在尝试混合SpringKafka(2.5.6.RELEASE)的监听器和Kotlin的协同程序。具体来说,我有一个
暂停乐趣

suspend fun updatePrice(command: StockPriceUpdateCommand): Boolean
然后,我有一个Spring Kafka侦听器,它必须在每次从分区读取新消息时调用该函数:

@KafkaListener(
    id = "priceListener",
    topics = [ "prices" ],
    groupId = "prices",
    properties = [
        "key.deserializer=org.apache.kafka.common.serialization.StringDeserializer",
        "value.deserializer=org.apache.kafka.common.serialization.DoubleDeserializer"
    ]
 ) 
 fun listenToPrices(
    @Header(name = KafkaHeaders.RECEIVED_MESSAGE_KEY) stock: String,
    @Payload price: Double) {

    useCase.updatePrice(StockPriceUpdateUseCase.StockPriceUpdateCommand(stock, price))
 }
显然,编译器不允许我调用
updatePrice
,因为出现了错误“挂起函数'updatePrice'应该只从一个协程或另一个挂起函数调用”

在这种情况下,哪种方法是正确的

谢谢。

有关
@RabbitListener
的类似问题,请参见

现在还不清楚你想在这里实现什么

我的理解是,挂起函数只能从协同程序调用;由于
@RabbitListener
方法是由框架调用的,而不是由用户代码调用的,因此我们必须在框架和侦听器之间添加一个垫片,但这究竟是如何执行任何有用的功能的呢


请参考这个。基本上,你需要启动一个协同程序,并在其中调用
updatePrice
。谢谢你,@Sergey。然而,我在后端环境中,而不是在Android应用程序中。Spring代理了该方法。我不知道声明协同程序的副作用是什么:)是的,我注意到了,但协同程序的概念是一样的:创建一个范围(或使用现有的);开展合作项目;需要时取消协同程序。如果我用
暂停乐趣
中的
@KafkaListener
注释更改我的函数签名,该怎么办?我不熟悉Kafka侦听器,但我想你会收到与
listenToPrices
函数相同的错误。谢谢,Gary。现在,我必须将侦听器调用的代码封装在
runBlocking
函数中。谢谢我将等待本机支持
suspend fun
:)