我正在尝试实现一个永久的工作流程,该工作流程从一个阻止直到传递消息(即 Redis' BLPOP
)的活动开始。完成后,我想异步启动一个新的工作流以进行某种处理并ContinueAsNew
立即返回。
我尝试使用子工作流程启动处理工作流程。我观察到的是,我的父工作流程在子执行之前完成。除非我处理返回的未来,但我真的不想这样做。
这样做的正确方法是什么?是否可以在工作流中启动新的常规工作流?此类操作会作为工作流的一部分还是在活动中实施?
先感谢您!
我正在尝试实现一个永久的工作流程,该工作流程从一个阻止直到传递消息(即 Redis' BLPOP
)的活动开始。完成后,我想异步启动一个新的工作流以进行某种处理并ContinueAsNew
立即返回。
我尝试使用子工作流程启动处理工作流程。我观察到的是,我的父工作流程在子执行之前完成。除非我处理返回的未来,但我真的不想这样做。
这样做的正确方法是什么?是否可以在工作流中启动新的常规工作流?此类操作会作为工作流的一部分还是在活动中实施?
先感谢您!
解决方案是在完成或作为新的父级继续之前等待子级工作流启动。
如果您使用Go Cadence 客户端,则workflow.ExecuteChildWorkflow
返回一个ChildWorkflowFuture,它扩展了Future
返回子工作流结果的 a。它还具有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
}
子工作流已从找到的工作流 IDchildWE.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);