Может ли дочерний рабочий процесс выполняться асинхронно?

Я пытаюсь реализовать постоянный рабочий процесс, который начинается с действия, которое блокируется до тех пор, пока сообщение не будет доставлено (а именно, Redis 'BLPOP). После его завершения я хочу запустить новый рабочий процесс в асинхронном режиме, чтобы выполнить некоторую обработку и немедленно вернуть ContinueAsNew.

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

Как правильно это сделать? Можно ли запустить новый обычный рабочий процесс в рамках рабочего процесса? Будет ли такое действие реализовано как часть рабочего процесса или в рамках действия?

Заранее спасибо!


person Jesús García Crespo    schedule 03.09.2019    source источник


Ответы (1)


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

Если вы используете Go Cadence Client, workflow.ExecuteChildWorkflow возвращает ChildWorkflowFuture, который расширяет дочерний рабочий процесс, который возвращает Future результат. Он также имеет метод GetChildWorkflow, который возвращает Future, который становится готовым, как только запускается дочерний элемент. Итак, чтобы дождаться запуска дочернего рабочего процесса, можно использовать следующий код:

f := workflow.ExecuteChildWorklfow(ctx, childFunc)
var childWE WorkflowExecution
// The following line unblocks as soon as the child is started.
if err := f.GetChildWorkflowExecution().Get(&childWE); err != nil {
   return err
}

Дочерний рабочий процесс запущен с идентификатором рабочего процесса в childWE.ID и идентификатором выполнения в childWE.RunID

Эквивалент Java:

 ChildType child = Workflow.newChildWorkflowStub(ChildType.class);
 // result promise becomes ready when the child completes
 Promise<String> result = Async.function(child::executeMethod);
 // childWE promise becomes ready as soon as the child is started
 Promise<WorkflowExecution> childWE = Workflow.getWorkflowExecution(child);
person Maxim Fateev    schedule 04.09.2019
comment
Спасибо, работает как шарм! Незначительное замечание: childWE следует использовать экспортированный тип workflow.Execution, если я правильно понял. - person Jesús García Crespo; 04.09.2019