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

Can a child workflow be executed asynchronously?

我正在尝试实现一个永久性工作流,该工作流以 activity 开始,该工作流阻塞直到消息被传递(即 Redis 的 BLPOP)。完成后,我想异步启动一个新的工作流来进行某种处理,并立即 return ContinueAsNew

我尝试使用子工作流启动处理工作流。我观察到的是我的父工作流在子工作流执行之前完成。除非我处理 returned 未来,但我真的不想那样做。

执行此操作的正确方法是什么?是否可以在一个工作流中启动一个新的常规工作流?此类操作是作为工作流程的一部分实施还是在 activity?

内实施

提前致谢!

解决方案是等待子工作流开始,然后再完成或作为新的父工作流继续。

如果您使用的是 Go Cadence Client the workflow.ExecuteChildWorkflow returns a ChildWorkflowFuture which extends a Future that returns the child workflow result. It also has GetChildWorkflowExectution 方法,那么 returns 一个 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
}

子工作流已启动,工作流 ID 在 childWE.ID 中找到,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);