Spring boot 如何使用Kotlin协程使用Spring AMQP消费消息?
我听说Spring Boot从2.2.0版开始就支持Kotlin协同程序。但当我尝试使用(2.2.0版)时,如下所示:Spring boot 如何使用Kotlin协程使用Spring AMQP消费消息?,spring-boot,kotlin,spring-amqp,kotlin-coroutines,spring-rabbit,Spring Boot,Kotlin,Spring Amqp,Kotlin Coroutines,Spring Rabbit,我听说Spring Boot从2.2.0版开始就支持Kotlin协同程序。但当我尝试使用(2.2.0版)时,如下所示: @RabbitListener(...) @Component class EventConsumer { @RabbitHandler suspend fun consumeEvent(e: MyEvent) { ... } } 然后发布一个事件: rabbitTemplate.convertAndSend("my-exchange
@RabbitListener(...)
@Component
class EventConsumer {
@RabbitHandler
suspend fun consumeEvent(e: MyEvent) {
...
}
}
然后发布一个事件:
rabbitTemplate.convertAndSend("my-exchange", "my-routing-key", MyEvent("data"))
我得到以下错误:
org.springframework.amqp.rabbit.support.ListenerExecutionFailedException:无法使用传入消息调用侦听器方法
端点处理程序详细信息:
方法[public java.lang.Object com.x.y.EventConsumer](com.x.y.MyEvent,kotlin.coroutines.ContinuationFirst,可能尝试将e:MyEvent
更改为e:Object
。如果我删除suspend关键字,一切都会正常工作,因此我认为这不会有帮助?兔子侦听器不支持kotlin coroutines。使用此代码,您究竟想实现什么?兔子侦听器是一个本质上已经是异步的:每当从队列中提取新消息时,就会从侦听器容器中的线程池调用该方法。使用该挂起,您希望实现什么目标?问题是,在该方法完成之前,线程将专用于该方法。协程不仅仅是异步的一种方式。它们是可以在没有专用线程开销的情况下实现异步。我们可以在这里使用runBlocking,然后至少在方法中使用协程,但仍然有一个专用线程不应该是必需的。这已经被webflux解决了,它与协程无缝集成,不会不必要地阻塞线程。我希望兔子侦听器也能如此。首先,可能尝试将e:MyEvent
更改为e:Object
。如果我删除suspend关键字,一切都会正常工作,因此我认为这不会有帮助?兔子侦听器不支持Kotlin协程。你到底想用这段代码实现什么?兔子侦听器是本质上已经是异步的:每当从队列中提取新消息时,侦听器容器中的线程池就会调用该方法。使用该挂起,您希望实现什么目标?问题是,在该方法完成之前,线程将专用于该方法。协程不仅仅是异步的一种方式。它们是一种不需要专用线程开销的异步方式。我们可以在这里使用runBlocking,然后至少在方法中使用协程,但仍然有一个专用线程是不必要的。这已经被webflux解决了,它与协程无缝集成,不会不必要地阻塞线程广告。我很想看到兔子的听众也是这样。