大家好,大家好。我正在开发一个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 ???
}
非常感谢您提供的任何帮助。
谢谢。
出于多种原因,建议您不要尝试做的事情。
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进行轮询并获得已处理的完整响应。
Spring Cloud Stream不适用于请求/回复处理。
请参见Spring AMQP (Spring for RabbitMQ) project。
RabbitTemplate
具有用于实现RPC模型的sendAndReceive
和convertSendAndReceive
方法。
在服务器端,@RabbitListener
方法可用于请求/答复。