子工作流可以异步执行吗?
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);
我正在尝试实现一个永久性工作流,该工作流以 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);