Будущее Java, обещание или?

#java #spring-boot #concurrency #reactive-programming

#java #весенняя загрузка #параллелизм #реактивное программирование

Вопрос:

У меня следующий сценарий.

  1. Пользователь запрашивает некоторую информацию из моего сервиса. Однако у меня нет информации, и я должен запросить ее со стороннего сайта.
  2. Я отправляю запрос (сообщение) на сторонний сайт. Вместо того, чтобы предоставлять информацию напрямую, сайт третьей части (который я не контролирую) ожидает URL обратного вызова в моем первоначальном сообщении. Итак, запрос, который я делаю для получения информации, возвращается немедленно, но без информации.
  3. Когда информация готова, сторонний сайт вызывает мою службу через URL обратного вызова (из моего первоначального сообщения) и предоставляет информацию (через сообщение).
  4. Затем я хочу вернуть информацию пользователю.

Проблема в том, что я хочу заблокировать запрос исходного пользователя на получение информации, пока не получу информацию обратно через обратный вызов. Я не уверен, как я должен кодировать это на Java. Я использую spring boot (хотя я не уверен, насколько это актуально). Я также рассматриваю возможность кодирования этого либо как обычного приложения spring boot mvc, либо как приложения с реактивной загрузкой spring (я бы хотел сделать последнее, но я все еще изучаю реактивную загрузку spring).). В любом случае, меня бы заинтересовали решения для любой платформы.

Основной вопрос заключается в том, как мне заблокировать первоначальный запрос информации о пользователе до тех пор, пока сторонний сайт не отправит информацию на URL обратного вызова? Я посмотрел на фьючерсы и обещания, и либо я их не совсем понимаю, либо они не те дроиды, которые я ищу.

Есть предложения? Заранее спасибо.

Ответ №1:

Если вы хотите заблокировать поток во время ожидания ответа от третьей стороны, это бесполезная трата ресурсов. Вам нужно подготовить объект со всей информацией о запросе пользователя и присвоить ему уникальный идентификатор, а также отправить запрос третьей стороне с URL обратного вызова, содержащим этот идентификатор, например http://myservice.org/callback?id=123 . Запустите сервер, чтобы принять эти обратные вызовы. Этот сервер извлекает идентификатор из url, находит объект пользовательского запроса с этим идентификатором из hashmap и отправляет ответ.

Комментарии:

1. Я прошу прощения за то, что не видел этого раньше. На самом деле я на некоторое время прекратил работу над этим проектом, чтобы заняться чем-то другим. Тем не менее, я снова работаю над этим. Я согласен с тем, что мое решение является пустой тратой ресурсов. Я, конечно, могу сохранить ServerRequest и получить к нему доступ через что-то, что я получаю от вызова. Я вижу, как создать объект ответа сервера. Чего я не знаю, так это как отправить ответ сервера обратно пользователю (обычно я возвращал его из исходного объекта запроса).

2. Я использую Spring Boot. Как мне сообщить spring, что я не хочу возвращать ответ на исходный запрос?

3. Я думаю, что ответ может быть связан с DeferredResult (в Spring Boot)