У меня есть служба REST, определенная в Spring Boot, которая предоставляет синхронный REST API для вызова пользователем из веб-интерфейса. Ожидается, что служба предоставит ответ в режиме реального времени.
Служба обращается к внешней конечной точке асинхронно. Это: - Единое одностороннее исходящее сообщение для запроса - Единое одностороннее входящее сообщение для ответа
Как я могу объединить два сообщения, чтобы создать впечатление синхронного поведения? Я думаю о нескольких подходах, например:
Служба отдыха отправляет запрос конечной точке. После ответа конечной точки ответ добавляется в ConcurrentHashMap. Служба Rest запрашивает HashMap каждые несколько миллисекунд и, как только находит правильный ответ, выходит с допустимым кодом причины HTTP. Это похоже на опрос, и я думаю, можно ли этого избежать.
Служба отдыха отправляет запрос конечной точке. Как только конечная точка отвечает, ожидающий поток в Rest Service получает уведомление. Однако ожидающий поток должен завершиться только в том случае, если получен правильный ответ (т. Е. Совпадающие идентификаторы корреляции и т. д.). Это возможно?
Я понимаю, что это похоже на сценарий ответа на запрос очереди JMS, где каждый запрос очереди JMS открывает прослушиватель в очереди ответов с критериями селектора сообщений. Однако в этом случае я должен реализовать это с помощью HTTP.
Любые мысли по этому поводу приветствуются. Я полностью убежден, что мне не хватает чего-то очень простого, но не знаю, что именно.
Большое спасибо!
Здравствуйте, Борис, спасибо !. Я прорабатываю проблему. Допустим, служба вызывается 2 раза: Запрос 1 -> Идентификатор сообщения («1») -> Ожидает ответа Запрос 2 -> Идентификатор сообщения («2») -> Ожидает ответа. Ответы приходят в следующем порядке (ina полностью отдельный асинхронный канал): - Ответ 2 -> Идентификатор корреляции («2») -> Он должен ответить на запрос 2 - Ответ 1 -> Идентификатор корреляции («1») -> Он должен ответить на запрос 1 Итак, по сути, что я Я ищу способ для ответа 1 уведомить только запрос 1 и никаких других запросов и т. д. Есть ли способ сделать это?
Как я уже сказал, используйте асинхронный канал - какое бы обещание он ни возвращал - и передайте его Spring. Он пометит запрос как асинхронный и обработает его.
Какой у вас асинхронный API?
Просто верните
Future
,ComplableFuture
,DeferedResult
,Mono
илиFlux
из вашего контроллера REST. Spring Boot сделает все остальное за вас.