与Spring Kafka侦听器一起使用Kotlin协程
我正在尝试混合SpringKafka(2.5.6.RELEASE)的监听器和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 = [ "
暂停乐趣
:
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
:)