У меня есть приложение на основе GraphQL Websocket, в котором мне нужно дождаться оплаты клиентом. Предполагается, что обработчик подписки
К сожалению, я не могу опубликовать какой-либо код, так как после шага 1 я не могу найти подробную информацию о том, какие конструкции (например, Mono или PubSub) использовать для «ожидания» в этом случае использования.
Как я могу связать исходящий запрос с вызовом веб-перехватчика?
Я могу предоставить любые другие детали, необходимые, чтобы сделать мой вопрос более ясным.
@abetteroliver - Извините, что не задал вопрос раньше! Вы правы, и я также отредактировал свой вопрос.
Кажется, есть недоразумение. Как вы собираетесь связать запрос с вебхуком? — это вопрос, который я задаю вам. Это совершенно не зависит от Webflux, и вам нужно знать об этом заранее. Затем мы можем поговорить о том, как использовать реактивные потоки здесь.
На шаге 1 я отправляю идентификатор платежного устройства в платежную службу (Square). После успешного платежа Square вызывает веб-хук с деталями платежа вместе с идентификатором устройства, чтобы я мог сопоставить платеж с транзакцией, которая его инициировала.
Информации по-прежнему слишком мало, но позвольте мне дать вам грубый набросок того, как это могло бы работать.
После отправки запроса к платежному шлюзу нам нужно сделать две вещи.
Mono
), в который вы можете отправить сигналMap
, который также доступен (через сервис) с помощью вебхука. Для производства вы можете подумать о более сложном способе.Когда веб-перехватчик получает запрос, вы просматриваете поток для идентификатора и отправляете ему сигнал (также может быть сигнал об ошибке). Тот, кто подписался на поток, теперь получает этот сигнал и может продолжить.
Теперь о том, какую конструкцию использовать. Может быть несколько альтернатив, одна из них — использовать Раковина. Вот некоторый псевдокод(!):
В методе, отправляющем платежный запрос:
activateTerminal(paymentDetails);
transactionSink = Sinks.empty();
transactionMap.put(deviceId, transactionSink);
return transactionSink.asMono();
Внутри вебхука:
transactionSink = transactionMap.get(deviceId);
transactionSink.tryEmitEmpty();
Последнее утверждение завершает Mono
, поэтому тот, кто «ждет» его, получает уведомление.
Пожалуйста, поймите этот ответ только как концепцию. Вещи, на которые вам нужно обратить более пристальное внимание, это:
Mono
).Если после этого у вас возникнут какие-либо конкретные вопросы, я рекомендую создать новый.
Большое спасибо, и я прошу прощения за предоставление схематичных деталей. Но ваше решение звучит так, как будто оно сработает. Я не знал о конструкции Sink. Я попробую этот подход!
В чем именно заключается ваш вопрос? Как вы собираетесь связать запрос с вебхуком?