Как использовать сопрограммы Kotlin для потребления сообщений с Spring AMQP? - PullRequest
0 голосов
/ 06 ноября 2019

Я прочитал , что Spring Boot поддерживает Kotlin Coroutines начиная с версии 2.2.0. Но когда я пытаюсь это сделать с spring amqp (версия 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: Listener method could not be invoked with the incoming message
Endpoint handler details:
Method [public java.lang.Object com.x.y.EventConsumer(com.x.y.MyEvent,kotlin.coroutines.Continuation<? super kotlin.Unit>)]
Bean [com.x.y.EventConsumer@1fce0403]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:214) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:143) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:132) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1569) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1488) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1476) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1467) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1411) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer$SimpleConsumer.callExecuteListener(DirectMessageListenerContainer.java:1035) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer$SimpleConsumer.handleDelivery(DirectMessageListenerContainer.java:995) ~[spring-rabbit-2.2.0.RELEASE.jar:2.2.0.RELEASE]

Если я удалю ключевое слово suspend, то все будет работать как положено.

Нужна ли какая-то специальная конфигурация для Spring AMQP для работы с Kotlin Coroutines или пока нет поддержки для этого?

...