Как Spring Webflux может ждать веб-перехватчика

У меня есть приложение на основе GraphQL Websocket, в котором мне нужно дождаться оплаты клиентом. Предполагается, что обработчик подписки

  1. Отправьте запрос на платежный шлюз для активации платежного терминала.
  2. Дождитесь вызова вебхука после оплаты для дальнейшей обработки.

К сожалению, я не могу опубликовать какой-либо код, так как после шага 1 я не могу найти подробную информацию о том, какие конструкции (например, Mono или PubSub) использовать для «ожидания» в этом случае использования.

Как я могу связать исходящий запрос с вызовом веб-перехватчика?

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

В чем именно заключается ваш вопрос? Как вы собираетесь связать запрос с вебхуком?

a better oliver 19.03.2022 15:32

@abetteroliver - Извините, что не задал вопрос раньше! Вы правы, и я также отредактировал свой вопрос.

Barun 19.03.2022 17:32

Кажется, есть недоразумение. Как вы собираетесь связать запрос с вебхуком? — это вопрос, который я задаю вам. Это совершенно не зависит от Webflux, и вам нужно знать об этом заранее. Затем мы можем поговорить о том, как использовать реактивные потоки здесь.

a better oliver 19.03.2022 19:42

На шаге 1 я отправляю идентификатор платежного устройства в платежную службу (Square). После успешного платежа Square вызывает веб-хук с деталями платежа вместе с идентификатором устройства, чтобы я мог сопоставить платеж с транзакцией, которая его инициировала.

Barun 20.03.2022 03:42
1
4
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Информации по-прежнему слишком мало, но позвольте мне дать вам грубый набросок того, как это могло бы работать.

После отправки запроса к платежному шлюзу нам нужно сделать две вещи.

  • Создайте поток (например, Mono), в который вы можете отправить сигнал
  • Создайте сопоставление между идентификатором (устройства или транзакции) и потоком. Для запуска вы можете использовать простой Map, который также доступен (через сервис) с помощью вебхука. Для производства вы можете подумать о более сложном способе.

Когда веб-перехватчик получает запрос, вы просматриваете поток для идентификатора и отправляете ему сигнал (также может быть сигнал об ошибке). Тот, кто подписался на поток, теперь получает этот сигнал и может продолжить.

Теперь о том, какую конструкцию использовать. Может быть несколько альтернатив, одна из них — использовать Раковина. Вот некоторый псевдокод(!):

В методе, отправляющем платежный запрос:

activateTerminal(paymentDetails);
transactionSink = Sinks.empty();
transactionMap.put(deviceId, transactionSink);
return transactionSink.asMono();

Внутри вебхука:

transactionSink = transactionMap.get(deviceId);
transactionSink.tryEmitEmpty();

Последнее утверждение завершает Mono, поэтому тот, кто «ждет» его, получает уведомление.

Пожалуйста, поймите этот ответ только как концепцию. Вещи, на которые вам нужно обратить более пристальное внимание, это:

  • Как сохранить ассоциацию
  • Наиболее подходящий для вас способ отправки сигнала в поток (Mono).

Если после этого у вас возникнут какие-либо конкретные вопросы, я рекомендую создать новый.

Большое спасибо, и я прошу прощения за предоставление схематичных деталей. Но ваше решение звучит так, как будто оно сработает. Я не знал о конструкции Sink. Я попробую этот подход!

Barun 20.03.2022 14:59

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