我正在尝试实施一个永久性的工作流程,该工作流程从一项阻止消息传递的活动开始(即Redis的BLPOP
)。完成后,我要异步启动新的工作流程以进行某种处理并立即返回ContinueAsNew
。
我尝试使用子工作流程来启动处理工作流程。我观察到的是,我的父工作流程在执行子任务之前已完成。除非我处理返回的未来,但我真的不想要这样做。
什么是正确的方法?是否可以在工作流程中启动新的常规工作流程?这样的动作是作为工作流的一部分还是在活动中实施的?
提前谢谢!
答案 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);