Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何使用Kotlin协程使用Spring AMQP消费消息?_Spring Boot_Kotlin_Spring Amqp_Kotlin Coroutines_Spring Rabbit - Fatal编程技术网

Spring boot 如何使用Kotlin协程使用Spring AMQP消费消息?

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

我听说Spring Boot从2.2.0版开始就支持Kotlin协同程序。但当我尝试使用(2.2.0版)时,如下所示:

@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解决了,它与协程无缝集成,不会不必要地阻塞线程广告。我很想看到兔子的听众也是这样。