Как можно уведомить конкретный поток в Spring Boot

У меня есть служба REST, определенная в Spring Boot, которая предоставляет синхронный REST API для вызова пользователем из веб-интерфейса. Ожидается, что служба предоставит ответ в режиме реального времени.

Служба обращается к внешней конечной точке асинхронно. Это: - Единое одностороннее исходящее сообщение для запроса - Единое одностороннее входящее сообщение для ответа

Как я могу объединить два сообщения, чтобы создать впечатление синхронного поведения? Я думаю о нескольких подходах, например:

  • Служба отдыха отправляет запрос конечной точке. После ответа конечной точки ответ добавляется в ConcurrentHashMap. Служба Rest запрашивает HashMap каждые несколько миллисекунд и, как только находит правильный ответ, выходит с допустимым кодом причины HTTP. Это похоже на опрос, и я думаю, можно ли этого избежать.

  • Служба отдыха отправляет запрос конечной точке. Как только конечная точка отвечает, ожидающий поток в Rest Service получает уведомление. Однако ожидающий поток должен завершиться только в том случае, если получен правильный ответ (т. Е. Совпадающие идентификаторы корреляции и т. д.). Это возможно?

Я понимаю, что это похоже на сценарий ответа на запрос очереди JMS, где каждый запрос очереди JMS открывает прослушиватель в очереди ответов с критериями селектора сообщений. Однако в этом случае я должен реализовать это с помощью HTTP.

Любые мысли по этому поводу приветствуются. Я полностью убежден, что мне не хватает чего-то очень простого, но не знаю, что именно.

Большое спасибо!

Просто верните Future, ComplableFuture, DeferedResult, Mono или Flux из вашего контроллера REST. Spring Boot сделает все остальное за вас.

Boris the Spider 17.12.2018 19:34

Здравствуйте, Борис, спасибо !. Я прорабатываю проблему. Допустим, служба вызывается 2 раза: Запрос 1 -> Идентификатор сообщения («1») -> Ожидает ответа Запрос 2 -> Идентификатор сообщения («2») -> Ожидает ответа. Ответы приходят в следующем порядке (ina полностью отдельный асинхронный канал): - Ответ 2 -> Идентификатор корреляции («2») -> Он должен ответить на запрос 2 - Ответ 1 -> Идентификатор корреляции («1») -> Он должен ответить на запрос 1 Итак, по сути, что я Я ищу способ для ответа 1 уведомить только запрос 1 и никаких других запросов и т. д. Есть ли способ сделать это?

Prabal Rakshit 17.12.2018 20:03

Как я уже сказал, используйте асинхронный канал - какое бы обещание он ни возвращал - и передайте его Spring. Он пометит запрос как асинхронный и обработает его.

Boris the Spider 17.12.2018 20:05

Какой у вас асинхронный API?

Boris the Spider 17.12.2018 20:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
172
0

Другие вопросы по теме