0

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

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

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

先感谢您!

4

1 回答 1

0

解决方案是在完成或作为新的父级继续之前等待子级工作流启动。

如果您使用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);
于 2019-09-04T03:19:48.767 回答