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

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

  1. Сделать заказ
  2. Обработка платежа
  3. Отправить вызов API третьей стороне
  4. Дождитесь, пока третий вызовет мой API через открытый веб-перехватчик.

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

workflow.makeOrder();

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

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

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

workflowExecution.getWorkflowId()

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

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

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

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

> ответьте, что рабочий процесс вызывает локальное действие по доставке результата: есть ли какое-нибудь руководство о том, как это сделать?

unclelim12 26.07.2019 08:50

Создайте заглушку локальной активности с помощью Workflow.newLocalActivityStub и вызовите для нее метод активности.

Maxim Fateev 26.07.2019 20:51

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