Как создать и использовать сообщение RabbitMQ с помощью Spring RestController и отправить его обратно пользователю - PullRequest
0 голосов
/ 07 февраля 2020

Привет всем и всем. Я работаю над приложением Spring Boot. Здесь моя проблема. У меня есть Spring RestController с пост-отображением, которое принимает некоторые данные. Затем мне нужно отправить эти данные через RabbitMQ в другое приложение, которое, в свою очередь, выполнит некоторые вычисления с этими данными, а затем отправит их мне, которые затем я хочу вернуть пользователю.

Я знаю, что RabbitMQ для асинхронной связи c. Но мне нужен мой контроллер, чтобы вернуть результат, который возвращается из RabbitMQ, в одном go. Прямо сейчас я использую.

@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 ???

   }

Любая помощь в этом деле очень ценится.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Spring Cloud Stream не предназначен для обработки запросов / ответов.

См. Проект Spring AMQP (Spring for RabbitMQ) .

В RabbitTemplate есть * Методы 1008 * и convertSendAndReceive для реализации модели RP C.

На стороне сервера для запроса / ответа может использоваться метод @RabbitListener.

0 голосов
/ 07 февраля 2020

То, что вы пытаетесь сделать, не рекомендуется по нескольким причинам.

   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, для этой указанной c части. Может быть, Websocket будет идеальным решением. Если нет, вам нужно иметь две конечные точки REST. Один для отправки и возврата идентификатора запроса, другой для периодического опроса идентификатора запроса и получения обработанного завершенного ответа.

...