如何在Spring RestController内部产生和使用RabbitMQ消息并将其发送回用户

问题描述 投票:0回答:2

大家好,大家好。我正在开发一个Spring Boot应用程序。这是我的问题。我有一个带有后映射的Spring RestController,可以接收一些数据。然后,我需要通过RabbitMQ将数据发送到另一个应用程序,该应用程序将对该数据执行一些计算,然后将其发送回给我,然后我想将其返回给用户。

我知道RabbitMQ用于异步通信。但是我需要我的控制器一次性返回从RabbitMQ返回的结果。我现在正在使用。

@EnableBinding(Sink::class)
class OptimizedScheduleMessageListener {
    @StreamListener(Sink.INPUT)
    fun handler(incomingMessage: MyDTO) {
        println(incomingMessage)
    }
}

从RabbitMQ检索结果。现在,我只需要我的控制器即可将其返回。

@PostMapping( produces = ["application/json"])
   fun retrieveOptimizedSchedule: Result<MyDTO> {

       myUncalculatedDTO: MyDTO()
       source.output().send(MessageBuilder.withPayload(myUncalculadeDTO).build())

       return ???

   }

非常感谢您提供的任何帮助。

谢谢。

spring kotlin rabbitmq spring-cloud-stream
2个回答
0
投票

出于多种原因,建议您不要尝试做的事情。

   1. The failure of the 'Another application' which consumes the Rabbit
      MQ messages will result in Requests being blocked on the controller end.
   2. There is a limit on how many requests you can have simultaneously from the server to clients.

您可以为此特定部分使用REST以外的任何其他通信协议。也许Websocket将是理想的解决方案。如果不是,则需要具有两个REST端点。一个提交并获取一个请求ID,另一个周期性地使用该请求ID进行轮询并获得已处理的完整响应。


0
投票

Spring Cloud Stream不适用于请求/回复处理。

请参见Spring AMQP (Spring for RabbitMQ) project

RabbitTemplate具有用于实现RPC模型的sendAndReceiveconvertSendAndReceive方法。

在服务器端,@RabbitListener方法可用于请求/答复。

© www.soinside.com 2019 - 2024. All rights reserved.