子工作流程可以异步执行吗?

时间:2019-09-03 22:29:25

标签: cadence-workflow

我正在尝试实施一个永久性的工作流程,该工作流程从一项阻止消息传递的活动开始(即Redis的BLPOP)。完成后,我要异步启动新的工作流程以进行某种处理并立即返回ContinueAsNew

我尝试使用子工作流程来启动处理工作流程。我观察到的是,我的父工作流程在执行子任务之前已完成。除非我处理返回的未来,但我真的不想要这样做。

什么是正确的方法?是否可以在工作流程中启动新的常规工作流程?这样的动作是作为工作流的一部分还是在活动中实施的?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案是等待子级工作流启动,然后再完成或继续新的父级工作

如果您使用的是Go Cadence Client,则workflow.ExecuteChildWorkflow会返回一个ChildWorkflowFuture,它会扩展一个Future并返回子工作流程结果。它还具有GetChildWorkflowExectution方法,该方法返回一个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中的工作流程ID和childWE.RunID中的运行ID开始

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);