Как смоделировать рабочий процесс, который должен вернуть результат в один из шагов

Предполагая, что у меня есть рабочий процесс:

  1. Сделать заказ
  2. Процесс оплаты
  3. Отправить вызов API третьему лицу
  4. Ждите 3-го, чтобы позвонить в мой API через открытый веб-крючок

Когда я делаю:

workflow.makeOrder();

это заблокирует, поэтому я не могу получить результат, пока шаги 1-4 не закончены.

Но если я сделаю это асинхронно:

WorkflowExecution workflowExecution = WorkflowClient.start(workflow::makeOrder);

workflowExecution.getWorkflowId()

Я не могу получить результат шага 1. Как я могу его достичь?

1 ответ

Решение

В настоящее время (лето 2019 г.) мы работаем над добавлением прямой поддержки для синхронного ожидания определенного условия в коде рабочего процесса. Мы полагаем, что в третьем квартале 2019 года он будет готов к производству.

До этого самое простое решение - использовать функцию запроса для возврата состояния рабочего процесса. Смотрите HelloQuery для примера. Основным недостатком этого решения является то, что клиент должен опрашивать рабочий процесс, пока состояние не будет обновлено, чтобы отразить результат шага 1.

Если вам необходимо обеспечить низкую задержку ответа, рекомендуется выполнить шаблон запроса / ответа в экземпляре рабочего процесса:

  • Процесс, который инициирует запрос, должен предоставить конечную точку для завершения запроса.
  • Синхронный запрос сначала отправляет сигнал в рабочий процесс. Аргументы сигнала включают уникальный requestId, а также хост и порт клиентской конечной точки. Тогда это создает CompletableFuture и вставляет его в карту, используя requestId в качестве ключа. Затем запрашивающий поток блокирует на этом Future.get,
  • После получения сигнала рабочий процесс выполняет все необходимые действия и переходы состояний. Затем для ответа рабочий процесс вызывает результат доставки локальной активности. Эта операция вызывает полную конечную точку запроса, используя хост и порт и передавая requestId в качестве одного из аргументов.
  • Поскольку используются хост и порт, специфичные для процесса, обработчик запросов выполняется в том же процессе, который отправил исходный сигнал. Затем он получает с карты CompletableFuture что исходный запрошенный поток заблокирован и завершает его результатом запроса, полученного в качестве другого аргумента активности.
  • Исходный поток разблокируется при получении результата запроса и может продолжить его выполнение.
Другие вопросы по тегам